Как получить имена файлов с помощью OpenFileDialog в .NET (1000+ файлов с множественным выбором) - PullRequest
2 голосов
/ 09 апреля 2010

Может быть, некоторые из вас сталкивались с этим раньше ...

Я открываю файлы для разбора. Я использую OpenFileDialog, конечно, но я ограничен буфером 2048 в строке .FileNames. Таким образом, я могу выбрать только несколько сотен файлов. Это нормально для большинства случаев. Однако, для примера, у меня есть в одном случае 1400 файлов для открытия. Вы знаете способ сделать это с помощью диалога открытия файла. Я просто хочу массив строк .FileNames, я передаю его классу синтаксического анализатора.

Я также думал о предложении опции FolderBrowserDialog, а затем я бы использовал какой-то другой метод, чтобы просто перебрать все файлы в каталоге, например класс DirectoryInfo. Я бы сделал это в крайнем случае, если бы у меня не было единого решения.

Ответы [ 4 ]

1 голос
/ 23 июня 2010

Я закончил тем, что написал метод, использующий OpenFileDialog, но косвенно проверяет длину строки пути. То есть, если метод завершается ошибкой, пользователю отображается ошибка, сообщающая ему, что файлов слишком много, а затем отображается FolderBrowser с выбранной папкой, в которой просматривал пользователь. Я также добавил отдельные параметры для импорта файлов или импорта. папки в меню.

Вот код для этого. Это методы в статическом классе, называемом DataFileIO, в который я помещаю все настройки ввода-вывода для написания в excel или для доступа к xml и т. Д.

        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; }
    }
1 голос
/ 09 апреля 2010

Я бы определенно пошел по пути FolderBrowser. Я НИКОГДА не хочу выбирать 50-100, а то и более 1000 файлов вручную. Лучше извлечь папку, запросить соответствие шаблону и выбрать их таким образом. С точки зрения удобства использования, выбор большого количества файлов - это плохой выбор, ИМХО.

1 голос
/ 09 апреля 2010

Вы получаете какую-либо ошибку или исключение? Вы уверены, что используете 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);
}
1 голос
/ 09 апреля 2010

Боже мой, я не могу себе представить, выбрав 1400 файлов в диалоге открытия файлов. Возможно, вам следует просто позволить пользователю ввести фильтр и затем выполнить вызов System.IO.Directory.GetFiles.

...