-1

我有这个代码:

_fi = new DirectoryInfo (subDirectoryName).GetFiles("*.bmp");
label15.Text = _fi.Length.ToString();
for (int i = 0; i < myNumbers.Count; i++)
{
    if (myNumbers[i] >= max_min_threshold)
    {
        FileName = i.ToString("D6") + ".bmp";
        if (File.Exists(subDirectoryName + "\\" + FileName))
           ...
    }
}

现在 _fi 包含 2255 个索引;在每个索引中都有一个文件名,例如在 index[0] 我看到:{000001.bmp}
In index[1] {000002.bmp}

然后我运行了 myNumbers,其中每个索引都包含 2256 个索引。例如在 index[0] 中有 225000 在 index[1] 中有 223000 等等。

我想要做的是使用此循环或其他方式以及每次迭代将文件名从 _fi 变量获取到 FileName 变量中。

所以在第一个变量中 FileName 将是 000001.bmp 在第二次迭代中 FileName 将是 000002.bmp 等等。

问题是 FileName 现在在第一次迭代中将是 000000.bmp ,它在硬盘中不存在。我在 _fi 中看到第一个文件是 000001.bmp

那么我怎样才能让它工作呢?

编辑:

试图这样做:

if (i == _fi.Length)
                            {
                                break;
                            }
                            FileName = (i + 1).ToString("D6") + ".bmp";

问题是,休息后它进入这部分:

button5.Enabled = true;
                        myTrackPanelss1.trackBar1.Maximum = counter;
                        myTrackPanelss1.trackBar1.Value = 0;
                        setpicture(0);

现在设置图片(0);将在 pictureBox1 中显示帧/图像编号 1,即文件:000001.bmp 这是 setpicture 函数:

private void setpicture(int indx)
        {
            if (_fi == null)
            {
                pictureBox1.Image = Lightnings_Extractor.Properties.Resources.Weather_Michmoret;
                button5.Enabled = false;
                label5.Visible = true;
            }
            else
            {
                if (indx >= 0 && indx <= myTrackPanelss1.trackBar1.Maximum && _fi.Length > indx)
                {
                    try
                    {
                        label19.ForeColor = Color.Red;
                        fileToolStripMenuItem.Enabled = true;
                        label19.Visible = false;
                        label20.Visible = false;
                        label14.Visible = true;
                        label15.Visible = true;
                        label8.Visible = true;
                        label9.Visible = true;
                        myTrackPanelss1.trackBar1.Enabled = true;
                        using (FileStream fs = new FileStream(_fi[indx].FullName, FileMode.Open))
                        {
                            this.label8.Visible = true;
                            this.label9.Visible = true;
                            this.label9.Text = _fi[indx].Name;
                            Image img = null;
                            Bitmap bmp = null;
                            Image imgOLd = null;

                            try
                            {
                                  
                                img = Image.FromStream(fs);
                                bmp = new Bitmap(img);

                                imgOLd = this.pictureBox1.Image;
                                this.pictureBox1.Image = bmp;
                                if (imgOLd != null)
                                    imgOLd.Dispose();

                                img.Dispose();
                                img = null;
                            }
                            catch
                            {
                                if (img != null)
                                    img.Dispose();
                                if (bmp != null)
                                    bmp.Dispose();
                                if (imgOLd != null)
                                    imgOLd.Dispose();
                            }
                        }
                    }
                    catch
                    {
                        button1.Enabled = false;
                        label1.Visible = false;
                        label2.Visible = false;
                        label3.Visible = false;
                        label4.Visible = false;
                        label11.Visible = false;
                        label12.Visible = false;
                        checkBox2.Enabled = false;
                        label19.Visible = true;
                        label19.ForeColor = Color.Green;
                        label19.Text = "The Selected Directory Is Access Denied";
                        label20.Visible = true;
                        label20.ForeColor = Color.Green;
                        label20.Text = "Please Set A Different Directory";
                        fileToolStripMenuItem.Enabled = false;
                        label14.Visible = false;
                        label15.Visible = false;
                        label8.Visible = false;
                        label9.Visible = false;
                        myTrackPanelss1.trackBar1.Enabled = false;
                        timer2.Stop();
                        return;
                    }
                }
                else
                {
                    Image imgOLd = this.pictureBox1.Image;
                    //this.pictureBox1.Image = null;

                    if (imgOLd != null)
                    {
                        imgOLd.Dispose();
                        imgOLd = null;
                    }
                    
                    Application.DoEvents();
                }
            }
        }

在线上:

using (FileStream fs = new FileStream(_fi[indx].FullName, FileMode.Open))

我现在遇到了异常,这不是在我休息之前;如果 i == _fi.Length 但在我这样做之后,我在这条线上遇到异常,它移动到捕获区域并扔给我:

该进程无法访问文件“D:\New folder (7)\MVI_3041.MOV_Automatic\000001.bmp”,因为它正被另一个进程使用。

System.IO.IOException was caught
  Message=The process cannot access the file 'D:\New folder (7)\MVI_3041.MOV_Automatic\000001.bmp' because it is being used by another process.
  Source=mscorlib
  StackTrace:
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
       at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
       at System.IO.FileStream..ctor(String path, FileMode mode)
       at Extracting_Frames.Form1.setpicture(Int32 indx) in D:\C-Sharp\Extracting_Frames\Extracting_Frames\Extracting_Frames\Form1.cs:line 508
  InnerException: 

我不知道为什么现在我得到了这个以前没有的异常。

4

6 回答 6

1

像这样创建文件名

FileName = (i + 1).ToString("D6") + ".bmp";

更新:

为了访问FileInfos in _fi,我会将它们添加到字典中以便快速查找。

Dictionary<string, FileInfo> fileDict = _fi.ToDictionary(f => f.Name);

(一定要有一个using System.Linq;。)

然后你可以找一个文件

FileInfo fi;
if (fileDict.TryGetValue(FileName, out fi)) {
    DoSomethingWithTheFile(fi);
}

这比打电话要快得多if (File.Exists(...))

于 2012-10-31T17:45:06.937 回答
1

如果你真的想从 FileInfo[] 获取文件名:

string[] names = new DirectoryInfo(subDirectoryName)
        .GetFiles("*.bmp")
        .Select(fi => fi.Name)
        .ToArray();
于 2012-10-31T17:38:23.640 回答
0

找到解决方案:

using (FileStream fs = new FileStream(_fi[indx].FullName,FileMode.Open, FileAccess.Read, FileShare.ReadWrite))

现在它的工作。

谢谢你们。

于 2012-10-31T20:49:56.640 回答
0

也许我不明白你的问题,但如果你只想遍历文件列表,你可以这样做......

_fi = new DirectoryInfo (subDirectoryName).GetFiles("*.bmp");

foreach (var file in _fi)
{
    FileName = file.Name;

    // The rest of your code...
}
于 2012-10-31T17:44:39.887 回答
0

从 1 而不是 0 开始 for 循环。这就是它首先寻找 000000.bmp 的原因。

编辑:为此,您需要更改数组引用。

于 2012-10-31T17:38:20.667 回答
0

如果您知道您的第一个文件名是 .000001.bmp,您似乎只需要更新打印以便 i 从 1 而不是 0 开始。(我在这里假设您对 ToString 的“D6”覆盖只是将 i 的值左移小数点后 6 位。

所以代替 i.toString("D6") 尝试 (i+1).toString("D6")。

这是又快又脏。更“干净”的方法是在上面的循环中从 1 开始 i ,但是您必须更改数组引用以免错过 0 索引

于 2012-10-31T17:41:19.193 回答