C # есть ли ограничение на количество выбранных файлов в диалоге открытия файлов

у меня есть приложение для форм C # windows, где я загружаю XML-файлы и графические файлы CGM в свое приложение из браузера Open File. Кажется, я могу выбрать пару сотен за раз, и это работает без ошибок, но больше, и появляется диалоговое окно, говорящее мне, что это может 'т найти файл такой-то, но дает только половину имени файла. Я'м, если предположить, что это связано с ограничением количества файлов, которые могут быть выбраны / обработаны за один проход через диалог открытия файла.

Кто-нибудь знает, что это за число, и есть ли способ обойти его, если у меня будет больше, чем этот лимит, чтобы выбрать сразу?

м эффективноимпорта» файлы в мое приложение, в результате чего с помощью цикла foreach выбранные файлы перемещаются в другую папку, и приложение записывает в файл XML все имена импортируемых файлов (а также другие данные в файлах).

Ниже весьИмпортировать' метод

private void addFilesToCSDBToolStripMenuItem_Click(object sender, EventArgs e)
{
    int DMsimported = 0;
    int graphicsImported = 0;

    if (projectName == "")
    {
        MessageBox.Show("Please open a project first", "DAWS");
        return;
    }

    DialogResult result = openFileDialog1.ShowDialog();
    if (result == DialogResult.OK)
    {
        MessageBox.Show("This process may take several minutes depending on the number of imports", "DAWS");
        Application.UseWaitCursor = true;

        foreach (string file in openFileDialog1.FileNames)
        {
            string fileName = Path.GetFileNameWithoutExtension(file); //Gets just the name from the file path
            string ext = Path.GetExtension(file.ToLower());

            if (ext != ".CGM" && ext != ".cgm")
            {
                    bool exists = xmlFileWriter.checkIfFIleExists(fileName + ext);

                    if (exists != true)
                    {
                        xmlFileWriter.writeDatatoXML(file);
                        File.Move(file, CSDBpath + projectName + "\\CheckedIN\\" + fileName + ext);
                        DMsimported = DMsimported + 1;
                    }
                    else
                    {
                        MessageBox.Show(fileName + " already exists in the CSDB. This file will be skipped.", "DAWS");
                    }  
                }
            else
            {
                if (File.Exists(CSDBpath + projectName + "\\Graphics\\" + fileName + ext))
                {
                    if (Properties.Settings.Default.OverwriteGraphics == true)
                    {
                        File.SetAttributes(CSDBpath + projectName + "\\Graphics\\" + fileName + ext, FileAttributes.Normal); // need this line in order to set the file attributes. Exception thrown otherwise when system tries to overwrite the file.
                        File.Delete(CSDBpath + projectName + "\\Graphics\\" + fileName + ext);
                        File.Copy(file, CSDBpath + projectName + "\\Graphics\\" + fileName  + ext); //need to give the option as to whether to delete the existing file or skipp.
                    }
                    else
                    {
                        MessageBox.Show(fileName + " already exists in the CSDB. This file will be skipped. To enable overwriting tick the checkbox in Preferences", "DAWS");
                    }
                }
                else
                {
                    File.Copy(file, CSDBpath + projectName + "\\Graphics\\" + fileName + ext);
                }

                graphicsImported = graphicsImported + 1;                            
            }   
        }

        Application.UseWaitCursor = false;

        buildAllListViews();
        copyCGMfilesToDirectories();

        if (DMsimported > 0)
        {
            MessageBox.Show(DMsimported.ToString() + " DM files successfully imported into the CSDB", "DAWS");
        }
        if (graphicsImported > 0)
        {
            MessageBox.Show(graphicsImported.ToString() + " graphic files successfully imported into the CSDB", "DAWS");
        }
        if (graphicsImported == 0 && DMsimported == 0)
        {
            MessageBox.Show("No files imported", "DAWS");
        }

        updateMainFilesList();  
    }  
}
 Daedalus31 мая 2013 г., 10:52
Код размещен @RvdK
 Daedalus31 мая 2013 г., 11:18
@Giedrius - ямы просто установили точку останова наif (result == DialogResult.OK) ' линия .... и программа недаже не достигнуть этой точки, прежде чем получить сообщение Windoes. К чему это относится?
 RvdK31 мая 2013 г., 10:45
Разместите некоторый код, как вы используете диалог.
 Matthew Watson31 мая 2013 г., 10:41
Я могу'не могу себе представить, что это будет ограничено всего несколькими сотнями. Я думаю, что происходит что-то еще. Вы можете воспроизвести с помощью простой программы? Где всплывает диалоговое окно? Пока вы выбираете файлы в диалоге Windows OpenFile?
 Giedrius31 мая 2013 г., 11:00
Я бы не использовал конкатенацию строк для создания пути (куда файл перемещается, копируется и т. Д.), Возможно, путь создания длиннее, чем позволяет система. Не могли бы вы показать точное исключение и трассировку стека или там?Не исключение, но какое-то сообщение Windows?
 Daedalus31 мая 2013 г., 11:07
@Giedrius Я могу работать в режиме отладки, и никакие исключения не выдаются, только сообщение Windows, которое говорит: "Файл C: [путь к файлу] не существует. Убедитесь, что указано правильное имя файла. "
 Giedrius31 мая 2013 г., 11:11
Не могли бы вы добавить точку останова до запуска цикла foreach? Если вы получите доступ к этой точке останова до появления сообщения, яЯ уверен, что исключение происходит из цикла, затем добавьте try catch для всего цикла и в catch добавьте точку останова, чтобы убедиться, что это не исключение.
 Giedrius31 мая 2013 г., 11:59
хм, не могли бы вы попытаться создать новое приложение Windows, поместите на него openfiledialog с настройками по умолчанию и попробуйте открыть ту же директорию, где у вас возникли проблемы? если проблема не устранена, создайте тестовую директорию и заполните ее тестовыми файлами.мы сделали в моем ответе только для того, чтобы убедиться, что это не какая-то проблема с разрешениями, а другими словами, чтобы изолировать проблему в меньшем контексте.

Ответы на вопрос(4)

нет проблем с 5000 файлами, поэтому похоже, что это зависит от .NET Framework / OS версии (ямы использовали достаточно длинные имена файлов, просто чтобы убедиться, что это не зависит от какого-то ограничения старых окон, например, максимальная длина всех имен файлов составляет 65536 или 32768):

var directory = @"c:\test\test";
Directory.CreateDirectory(directory);

for (int i = 0; i < 5000; i++)
{
    var path = Path.Combine(directory, i.ToString() + new string('a', 200));
    File.WriteAllText(path, "");
}

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    var fileCount = openFileDialog1.FileNames;
    var lastFileName = openFileDialog1.FileNames[4999];
}
 Daedalus31 мая 2013 г., 10:56
Хм, так что без ограничений. Я'Я тоже использую 4.5, поэтому должно быть что-то еще. Я'Мы только что опубликовали код выше. будь добр, взгляни и посмотри, есть лиЕсть что-то принципиально неправильное, что могло бы вызвать это.

статья, вы получите ""Too many files selected сообщение об ошибке при использованииOpenFileDialog контроль, чтобы выбрать более200 файлы.

 Daedalus31 мая 2013 г., 10:52
Спасибо но яЯ не получаю эту ошибку. Это просто дает мне диалог, говорящий, что можетнайти файл, но показывает только часть имени файла, как будтообрывается.
 Matthew Watson31 мая 2013 г., 10:58
@Daedalus Но это может быть потому, что ты неправильно обработать исключение - вы можете запустить его в отладчике сDebug -> Exceptions -> Common Language Runtime Exceptions -> Thrown[x] выбран? я»
 Matthew Watson31 мая 2013 г., 10:50
Безразлично»Хотя, похоже, он соответствует тому, что говорит ОП. Но я думаю, что они просто не обрабатывают исключение должным образом, так что это, вероятно, ответ.
 Daedalus31 мая 2013 г., 12:03
@ MatthewWatson да, я просто попробовал это, и ничего не изменилось. Если исключение выдается перед строкойif (result == DialogResult.OK) ' тогда, конечно, я мало что могу сделать, чтобы это контролировать? Похоже, проблема в самом элементе управления диалогового окна, не так ли?
 Eoin Campbell31 мая 2013 г., 10:49
очень хорошая находка :-)
 Daedalus31 мая 2013 г., 11:20
мы просто установили точку останова наif (result == DialogResult.OK) ' линия .... и программа недаже не достигнуть этой точки, прежде чем получить сообщение Windoes. Есть идеи, на что это может указывать ??
 Matthew Watson31 мая 2013 г., 11:53
@Daedalus Это будет означать, что что-то бросило исключение, прежде чем достичь этой точки. Вы пробовали работать под отладчиком сThrown обнаружение исключений включено?

Свойство OpenFileDialog.Multiselect:

Существует жестко заданное ограничение в 200 файлов, которое можно открыть с помощью диалогового окна «Открыть файл». Для получения дополнительной информации об этом ограничении см. Статью 820631 "PRB: 'Выбрано слишком много файлов ' Сообщение об ошибке появляется при использовании элемента управления OpenFileDialog "в базе знаний Microsoft по адресуhttp://support.microsoft.com.

Когда вам приходится работать с таким большим количеством файлов, возможно, имеет смысл выбрать только папку (даже более разумно, если вы выберете все файлы в папке, если это ваш случай). Попробуйте использоватьКласс FolderBrowserDialog:

var folderBrowserDialog = new FolderBrowserDialog();
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
    var fi = new DirectoryInfo(folderBrowserDialog.SelectedPath);
    // here you get the files collection
    var files = fi.GetFiles();
}

Пытаться:

   if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    openFileDialog1.Multiselect = false;
    var fileCount = openFileDialog1.FileNames;
    var lastFileName = openFileDialog1.FileNames[4999];
} 
 Daedalus31 мая 2013 г., 11:39
Спасибо, но, к сожалению, это ничего не делает, и я бы не сталЯ не ожидаю, что я установлю точку останова наif (result == DialogResult.OK) ' линия, программа недаже не достигните этой точки, прежде чем появится сообщение. Так что с моим ограниченным опытом ясказал бы этоЧто-то делать с диалогом. 'DialogResult result = openFileDialog1.ShowDialog (); '

Ваш ответ на вопрос