2

たぶんあなた方の何人かは以前にこれに出くわしたことがあります…。

解析用にファイルを開いています。もちろん、私はOpenFileDialogを使用していますが、.FileNames文字列のバッファーは2048に制限されています。したがって、数百のファイルしか選択できません。ほとんどの場合、これで問題ありません。ただし、たとえば、1つのケースで1400個のファイルを開く必要があります。ファイルを開くダイアログでこれを行う方法を知っていますか。.FileNamesの文字列配列が必要なだけで、それをパーサークラスに渡します。

また、FolderBrowserDialogオプションを提供することも考えていました。その後、DirectoryInfoクラスなど、ディレクトリ内のすべてのファイルをループする他の方法を使用しました。オールインワンのソリューションが得られない場合は、最後の手段としてこれを行います。

4

4 に答える 4

1

私は間違いなく FolderBrowser ルートに行きます。手動で 50 ~ 100 個のファイルを選択する必要はありません。フォルダーを取得し、一致するパターンを入力して、その方法で選択することをお勧めします。使いやすさの観点から、多数のファイルを選択することは、私見では悪い選択です。

于 2010-04-09T13:09:53.233 に答える
1

エラーまたは例外が発生しますか? 名前空間の を使用OpenFileDialogしていることは確かですか?System.Windows.Forms

次のコードは、選択された 2000 を超えるファイルで完全に機能します。

System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
ofd.InitialDirectory = @"C:\Windows\system32\";
ofd.Multiselect = true;
ofd.ShowDialog();

foreach (var file in ofd.FileNames)
{
    Trace.WriteLine(file);
}
于 2010-04-09T13:14:37.227 に答える
1

私がやったことは、OpenFileDialogを使用するメソッドを書くことでしたが、パス文字列の長さを間接的にチェックします。つまり、メソッドが失敗した場合、ファイルが多すぎることを知らせるエラーがユーザーに表示され、ユーザーが探していたフォルダーが選択された状態で FolderBrowser が表示されます。ファイルをインポートまたはインポートするための別のオプションも追加しました。メニューバーのフォルダー。

これを行うコードは次のとおりです。これらは、DataFileIO と呼ばれる静的クラスのメソッドであり、Excel、アクセス、xml などに書き込むためのすべてのカスタマイズ IO を配置します。

        public static string[] GetFiles()
    {
        string[] fileNames;
        OpenFileDialog openFileDialog1 = new OpenFileDialog();

        openFileDialog1.InitialDirectory = UniversalDataImporter.Properties.Settings.Default.openFilePath;
        openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        openFileDialog1.FilterIndex = 2;
        openFileDialog1.RestoreDirectory = false;
        openFileDialog1.Multiselect = true;
        openFileDialog1.CheckFileExists = false;

        try
        {
            DialogResult result = openFileDialog1.ShowDialog();
            if (result == DialogResult.OK && openFileDialog1.FileNames.Count() <501 )
            {
                UniversalDataImporter.Properties.Settings.Default.openFilePath =
                    Path.GetDirectoryName(openFileDialog1.FileName);
                UniversalDataImporter.Properties.Settings.Default.Save();
                return fileNames = openFileDialog1.FileNames;
            }
            else if (result == DialogResult.Cancel)
            {
                return null;
            }
            else
            {
                if (MessageBox.Show("Too many files were Selected. Would you like to import a folder instead?",
                    "Too many files...", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    return fileNames = GetFilesInFolder();
                }
                else
                {
                    return null;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
            return null;
        }
    }

    public static string[] GetFilesInFolder()
    {

        FileInfo[] fileInfo;

        string pathName;
        FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();

        folderBrowserDialog.RootFolder = System.Environment.SpecialFolder.Desktop;

        DialogResult results = folderBrowserDialog.ShowDialog();

        if (results == DialogResult.OK)
        {
            try
            {
                pathName = folderBrowserDialog.SelectedPath;

                DirectoryInfo dir = new DirectoryInfo(pathName);
                if (dir.Exists)
                {

                    fileInfo = dir.GetFiles();

                    string[] fileNames = new string[fileInfo.Length];

                    for (int i = 0; i < fileInfo.Length; i++)//this is shit
                    {
                        fileNames[i] = fileInfo[i].FullName;
                    }

                    return fileNames;
                }
                else
                {
                    return null;
                }


            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
                return null;
            }

        }
        else if (results == DialogResult.Cancel) 
        {
            return null;
        }
        else { return null; }
    }
于 2010-06-23T12:35:57.730 に答える
1

ファイルを開くダイアログで 1400 個のファイルを選択することは想像できません。おそらく、ユーザーがフィルターを入力して System.IO.Directory.GetFiles 呼び出しを実行できるようにする必要があります。

于 2010-04-09T13:07:40.767 に答える