C # WinForms App - Ошибка отладки - Длина не может быть меньше нуля.Имя параметра: длина - PullRequest
0 голосов
/ 31 марта 2011

В режиме отладки при запуске приложения C # WinForms я успешно выбираю несколько файлов через OpenFileDialog, который затем отображается в окне журнала, эти файлы копируются во временный каталог, и я полагаю, что получаю ошибку при попыткеконвертировать файлы Excel в CSV.Я получаю следующую ошибку отладки во время выполнения:

Error: You may not have permission to read the file or it may be corrupt. 
Reported Error: Length Can not be less than zero. 
Parameter Name: Length.

Как мне исправить эту ошибку?

Вот мой код на MainForm.cs

            // Consolidate Button Click Commands that executes if there are no user input errors 
    void ExecuteConsolidate()
    {
        string consolidatedFolder = targetFolderBrowserDialog.SelectedPath;
        string tempfolder = targetFolderBrowserDialog.SelectedPath + "\\tempDirectory";
        string sFile = "";

        //create a temporary directory to store selected excel and csv files
        if (!Directory.Exists(tempfolder))
        {
            Directory.CreateDirectory(tempfolder);
        }       
        try
        {
            for (int i = 0; i < listBoxSourceFiles.Items.Count; i++)
            {
                sFile = listBoxSourceFiles.Items[i].ToString();
                // Copy each selected xlsx files into the specified Temporary Folder 
                System.IO.File.Copy(textBoxSourceDir.Text + "\\" + sFile, tempfolder + @"\" + System.IO.Path.GetFileName(sFile), true);
                Log("File " + sFile + " has been copied to " + tempfolder + @"\" + System.IO.Path.GetFileName(sFile));                                                                          
            } // ends foreach    

            Process convertFilesProcess = new Process();
            // remove xlsx extension from filename so that we can add the .csv extension 
            string csvFileName = sourceFileOpenFileDialog.FileName.Substring(0, sourceFileOpenFileDialog.FileName.Length - 3);

            // command prompt execution for converting xlsx files to csv
            convertFilesProcess.StartInfo.WorkingDirectory = "I:\\CommissisionReconciliation\\App\\ConvertExcel\\";
            convertFilesProcess.StartInfo.FileName = "ConvertExcelTo.exe";
            convertFilesProcess.StartInfo.Arguments = " ^ " + targetFolderBrowserDialog.SelectedPath + "^" + csvFileName + ".csv";
            convertFilesProcess.StartInfo.UseShellExecute = true;
            convertFilesProcess.StartInfo.CreateNoWindow = true;
            convertFilesProcess.StartInfo.RedirectStandardOutput = true;
            convertFilesProcess.StartInfo.RedirectStandardError = true;
            convertFilesProcess.Start();

            //Process that creates all the xlsx files in temp folder to csv files.
            Process consolidateFilesProcess = new Process();

            // command prompt execution for CSV File Consolidation
            consolidateFilesProcess.StartInfo.WorkingDirectory = targetFolderBrowserDialog.SelectedPath;
            consolidateFilesProcess.StartInfo.Arguments = "Copy *.csv ^" + csvFileName + ".csv";
            consolidateFilesProcess.StartInfo.UseShellExecute = false;
            consolidateFilesProcess.StartInfo.CreateNoWindow = true;
            consolidateFilesProcess.StartInfo.RedirectStandardOutput = true;
            consolidateFilesProcess.StartInfo.RedirectStandardError = true;
            consolidateFilesProcess.Start();

            Log("All Files at " + tempfolder + " has been converted to a csv file");
            Thread.Sleep(2000);
            StreamReader sOut = consolidateFilesProcess.StandardOutput;
            sOut.Close();

        }
        catch (SecurityException ex)
        {
            // The user lacks appropriate permissions to read files, discover paths, etc.
            MessageBox.Show("Security error. The user lacks appropriate permissions to read files, discover paths, etc. Please contact your administrator for details.\n\n" +
            "Error message: " + ex.Message + "\n\n");
        }
        catch (Exception ex)
        {
            // Could not load the image - probably related to Windows file system permissions.
            MessageBox.Show("You may not have permission to read the file, or " +
             "it may be corrupt.\n\nReported error: " + ex.Message);
        }
        try
        {                
            if (Directory.Exists(tempfolder))
            {
                Directory.Delete(tempfolder, true);
            }
        }
        catch (SecurityException ex)
        {
            // The user lacks appropriate permissions to read files, discover paths, etc.
            MessageBox.Show("Security error. The user lacks appropriate permissions to read files, discover paths, etc. Please contact your administrator for details.\n\n" +
            "Error message: " + ex.Message + "\n\n");
        }
        catch (Exception ex)
        {
            // Could not load the image - probably related to Windows file system permissions.
            MessageBox.Show("You may not have permission to read the file, or " +
             "it may be corrupt.\n\nReported error: " + ex.Message);
        }
        finally
        {
            // reset events
            m_EventStopThread.Reset();
            m_EventThreadStopped.Reset();

            // create worker thread instance;
            m_WorkerThread = new Thread(new ThreadStart(this.WorkerThreadFunction));
            m_WorkerThread.Start();
        }
    } // ends void ExecuteConsolidate()

Спасибо за внимание!:) Все полезные ответы получат положительные голоса!:) Если вам нужна дополнительная информация, такая как метод workerThread или код app.config, дайте мне знать!

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Скорее всего, эта строка вызывает вашу проблему:

string csvFileName = sourceFileOpenFileDialog.FileName.Substring(0, sourceFileOpenFileDialog.FileName.Length - 3);

Почему бы не использовать Path.GetFileNameWithoutExtension, чтобы получить имя файла без расширения?

2 голосов
/ 31 марта 2011

Полагаю, он умирает здесь:

string csvFileName = sourceFileOpenFileDialog.FileName.Substring(0, 
           sourceFileOpenFileDialog.FileName.Length - 3);

Напишите это так и посмотрите, поможет ли это:

string selectedFile = sourceFileOpenFileDialog.FileName;
string csvFileName = Path.Combine(Path.GetDirectoryName(selectedFile), 
           Path.GetFileNameWithoutExtension(selectedFile));

Это перевод вашей строки.

Но я думаю, вы действительно хотели просто иметь имя файла без пути:

string csvFileName = 
         Path.GetFileNameWithoutExtension(sourceFileOpenFileDialog.FileName);
1 голос
/ 07 апреля 2011

И разбить на все ошибки:

  • Перейти к «Отладка» -> Исключения (или CTRL + ALT + E)

  • Установите флажок «Брошено» в исключениях общего времени выполнения

  • После исправления не забудьте сбросить его (кнопка «Сбросить все»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...