C# WinForms 应用程序 - 调试错误 - 长度不能小于零。参数名称:长度

发布于 2024-10-28 09:30:03 字数 5448 浏览 0 评论 0原文

在调试模式下,运行 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代码,请告诉我!

In debug mode, while running the C# WinForms App, I successfully select multiple files through the OpenFileDialog, which is then displayed in the logging window, these files are copied to a temp directory and I believe I get the error when trying to convert the excel files to csv. I get the following runtime debug error:

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.

How do I fix this error?

Here's my code on 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()

Thanks for looking! :)
All helpful answers will receive up-votes! :)
If you need more information like the workerThread method or the app.config code, let me know!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情释 2024-11-04 09:30:03

这很可能是这一行导致您的问题:

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

Why not use Path.GetFileNameWithoutExtension to get the filename without extensions?

It is most likely this line that is causing your problem:

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

Why not use Path.GetFileNameWithoutExtension to get the filename without extension?

疾风者 2024-11-04 09:30:03

我想它死在这里:

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);

I suppose it dies here:

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

Write it like this and see if it helps:

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

This is the translation of your line.

But I think, you really wanted to just have the filename without path:

string csvFileName = 
         Path.GetFileNameWithoutExtension(sourceFileOpenFileDialog.FileName);
请别遗忘我 2024-11-04 09:30:03

并中断所有错误:

  • 转到“调试”->异常(或 CTRL+ALT+E)

  • 在公共语言运行时异常上勾选“引发”

  • 修复完成后,不要忘记重置它(重置全部按钮)

And to break on All Errors:

  • Go to "Debug" -> Exceptions (or CTRL+ALT+E)

  • Tick "Thrown" on Common Language Runtime Exceptions

  • Once done with you fix, dont forget to reset it (Reset All button)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文