-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}

次に、それぞれに 2256 個のインデックスを含む myNumbers を実行しています。たとえば、index[0] には 225000 があり、index[1] には 223000 があります。

私がやりたいことは、このループまたは他の方法と各反復を使用して、ファイル名を _fi 変数から FileName 変数に取得することです。

したがって、最初の変数の FileName は 000001.bmp になり、2 回目の反復では FileName は 000002.bmp になり、以降も同様です。

問題は、最初の反復で FileName がハードディスクに存在しない 000000.bmp になることです。最初のファイルは 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);

今 setpicture(0); フレーム/画像番号 1 のファイルが pictureBox1 に表示されます: 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))

休憩する前ではなかった例外が発生しています。if 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

本当に FileInfo[] からファイル名を取得したい場合:

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

このようなファイル名を作成します

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

アップデート:

のにアクセスするFileInfo_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 に答える
0

見つかった解決策:

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

今、その作業。

皆さん、ありがとうございました。

于 2012-10-31T20:49:56.640 に答える
0

for ループを 0 ではなく 1 から開始します。そのため、最初に 000000.bmp を探します。

編集:これを行うには、配列参照を変更する必要があります。

于 2012-10-31T17:38:20.667 に答える
0

最初のファイル名が .000001.bmp. (ここでは、ToString の "D6" オーバーライドが、i の値から 10 進数の 6 桁を左に移動しているだけであると想定しています。

したがって、i.toString("D6") の代わりに (i+1).toString("D6") を試してください。

これは迅速で汚いです。より「クリーンな」方法は、上記のループで i を 1 から開始することですが、0 インデックスを見逃さないように配列参照を変更する必要があります

于 2012-10-31T17:41:19.193 に答える
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 に答える