【问题标题】:C# - StreamReader SecurityException Process OpenFileDialog related Errors on WinForms ApplicationC# - WinForms 应用程序上的 StreamReader SecurityException 处理 OpenFileDialog 相关错误
【发布时间】:2011-07-19 16:27:10
【问题描述】:

大家好,背景: 我正在使用带有 OpenFileDialog、FileBrowserDialog 的 C# 开发一个 WinForms 应用程序,它将使用命令行可执行文件将多个文件从 excel 转换为 1 个 csv 文件。

错误:我应该添加什么使用指令或程序集引用来防止这些错误?

  • sOut”在当前上下文中不存在
  • 'sErr' 在当前上下文中不存在
  • 'sourceFileOpenFileDialog.SelectedFiles' 不包含 'SelectedFiles' 的定义,并且找不到接受 system.windows.forms.openfiledialog 类型的第一个参数的扩展方法(您是否缺少使用指令或程序集引用?)
  • 'sourceFileOpenFileDialog.SelectedPath' 不包含 'SelectedPath' 的定义,并且找不到接受 system.windows.forms.openfiledialog 类型的第一个参数的扩展方法(您是否缺少使用指令或程序集引用?)
  • 'SecurityException' 找不到(您是否缺少 using 指令或程序集引用?)
  • 'Process' 找不到(您是否缺少 using 指令或程序集引用?)
  • 'fileName' 找不到(您是否缺少 using 指令或程序集引用?)
  • sourceFileOpenFileDialog.FileNames”无法将类型“string[]”隐式转换为“string”

谢谢!

这是 MainForm.CS 文件中的代码:

    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.IO;
    using System.Diagnostics;
    using System.Security;

    // Select Source Files Button 
    private void sourceFiles_Click(object sender, EventArgs e)
    {
        Stream myStream = null;
        OpenFileDialog openFileDialog1 = new OpenFileDialog();

        this.sourceFileOpenFileDialog.InitialDirectory = "i:\\CommissisionReconciliation\\Review\\";
        this.sourceFileOpenFileDialog.Filter = "Excel Files (*.xls;*.xlsx;)|*.xls;*.xlsx;|All Files (*.*)|*.*";
        this.sourceFileOpenFileDialog.FilterIndex = 2;
        this.sourceFileOpenFileDialog.RestoreDirectory = true;
        this.sourceFileOpenFileDialog.Multiselect = true;
        this.sourceFileOpenFileDialog.Title = "Excel File Browser";

        DialogResult dr = this.sourceFileOpenFileDialog.ShowDialog();
        if (dr == System.Windows.Forms.DialogResult.OK)
        {
            string consolidatedFolder = targetFolderBrowserDialog.SelectedPath; 
            // Read the files
            foreach (String file in sourceFileOpenFileDialog.FileNames)
            {
                try
                {
                    // Copy each selected xlsx files into the specified TargetFolder 

                    System.IO.File.Copy(fileName, consolidatedFolder + @"\" + System.IO.Path.GetFileName(fileName)); 

                    // Convert each selected XLSX File to CSV Using the command prompt
                    // [I:\CommissisionReconciliation\App\ConvertExcel\ConvertExcelTo.exe ^ .XLS file location ^ filename.csv] 
                    // example: ConvertExcelTo.exe ^ I:\CommissisionReconciliation\ Review\_Consolidated\ALH\2011-350-00-600070-
                    // 03-09alh-AMLHS of Florida.xlsx ^ 2011-350-00-600070-03-09alh-AMLHS of Florida.csv

                    Process convertFilesProcess = new Process();

                    // command prompt execution 
                    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();

                    StreamReader sOut = convertFilesProcess.StandardOutput;
                    StreamReader sErr = convertFilesProcess.StandardError;

                }

                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("Cannot display the image: " + file.Substring(file.LastIndexOf('\\'))
                     + ". You may not have permission to read the file, or " +
                     "it may be corrupt.\n\nReported error: " + ex.Message);
                }

                finally
                {
                    Stream sOut
                    .Close();
                    sErr.Close();
                }

                try
                {
                    // Combine all .csv files into 1 csv file using the command prompt
                    // [.csv File location: Copy *.csv ^ filename.csv]
                    // example: [.CSV I:\CommissisionReconciliation\ Review\_Consolidated\ALH\: Copy *.csv 
                    // ^2011-350-00-600070-03-09alh-AMLHS of Florida.csv)

                    Process consolidateFilesProcess = new Process();

                    // substring function to take off the extension from sourceFileOpenFileDialog.FileName
                    // int csvFileName.Length = sourceFileOpenFileDialog.FileName.Length - 3;  

                    consolidateFilesProcess.StartInfo.WorkingDirectory = "I:\\CommissisionReconciliation\\App\\ConvertExcel\\";
                    consolidateFilesProcess.StartInfo.FileName = "ConvertExcelTo.exe"; 
                    consolidateFilesProcess.StartInfo.Arguments = " .CSV " + " ^ " + targetFolderBrowserDialog.SelectedPath + ": Copy *.csv ^" + csvFileName+ ".csv";
                    consolidateFilesProcess.StartInfo.UseShellExecute = false;
                    consolidateFilesProcess.StartInfo.CreateNoWindow = true;
                    consolidateFilesProcess.StartInfo.RedirectStandardOutput = true;
                    consolidateFilesProcess.StartInfo.RedirectStandardError = true;
                    consolidateFilesProcess.Start();

                    StreamReader sOut = consolidateFilesProcess.StandardOutput;
                    StreamReader sErr = consolidateFilesProcess.StandardError;
                }

                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("Cannot display the image: " + file.Substring(file.LastIndexOf('\\'))
                     + ". You may not have permission to read the file, or " +
                     "it may be corrupt.\n\nReported error: " + ex.Message);
                }

                finally
                {
                    sOut.Close();
                    sErr.Close();
                }

            } // ends foreach (String file in openFileDialog1.FileNames)
        }  // ends if (dr == System.Windows.Forms.DialogResult.OK)


        if (sourceFileOpenFileDialog.ShowDialog() == DialogResult.OK)
        {
            try
            {
                if ((myStream = sourceFileOpenFileDialog.OpenFile()) != null)
                {
                    using (myStream)
                    {
                        textBoxSourceFiles.Text = sourceFileOpenFileDialog.FileNames;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
            }
        }

        if (sourceFileOpenFileDialog.ShowDialog() == DialogResult.OK)
        {
            Log("Source Files: " + sourceFileOpenFileDialog.SelectedFiles);
        }
        textBoxSourceFiles.Text = sourceFileOpenFileDialog.SelectedFiles;
    } // ends selectFilesButton_Click method 


    // Source Folder Path Click Button 

【问题讨论】:

  • 已修复错误:找不到“进程”(您是否缺少 using 指令或程序集引用?) w/ using System.Diagnostics;
  • 已修复错误:找不到“SecurityException”(您是否缺少 using 指令或程序集引用?) w/ using System.Security;
  • 修复错误:通过更改为 sourceFileOpenFileDialog.FileName 找不到“fileName”(您是否缺少 using 指令或程序集引用?)
  • 我们再给你一个小时左右。
  • 来吧,汉斯索罗,我不想花几个小时调试哈哈

标签: c# winforms error-handling streamreader openfiledialog


【解决方案1】:

解决你的错误

sourceFileOpenFileDialog.FileNames 无法将类型“string[]”隐式转换为“string”

您需要更改此部分,您正在尝试将字符串数组推入字符串(.Text)

using (myStream)
{
   // change FileNames to FileName
   textBoxSourceFiles.Text = sourceFileOpenFileDialog.FileName; 

}

也许遍历 FileNames 数组并将字符串连接在一起以放入 .Text?

对于“.SelectedFiles”和“.SelectedPath”的问题,这些不是openFileDialog的属性,所以这就是它抱怨的原因..

同样,您可以使用“.FileNames”来获取在对话框中选择的文件(如果您只允许一个选择,则可以使用“.FileName”)

使用 sOutsErr 您在流程后期设置它们并在 finally 语句中清理它们,可能发生的情况是流程在您之前爆炸去你的

StreamReader sOut = covertFilesProcess.StandardOutput;
StreamReader sErr = covertFilesProcess.StandardError;

当你点击 finally 时,它不知道要关闭的 sOutsErr 是什么,因为它们还没有被制作出来。

【讨论】:

  • 感谢您的回复!您可以编辑答案以包含正确的代码吗?我应该使用哪些正确属性来引用 openFileDialog 中选择的路径和文件?您将如何修复代码中的 sOut 进程....
  • 我应该使用这个字符串 directoryPath = Path.GetDirectoryName(filePath); ?
【解决方案2】:

目前已修复以下错误:

  • 'SecurityException' 找不到(您是否缺少 using 指令或程序集引用?)通过添加

      using System.Security;
    
  • 'Process' 找不到(您是否缺少 using 指令或程序集引用?)通过添加:

      using System.Diagnostics; 
    
  • 通过更改为 sourceFileOpenFileDialog.FileName 找不到

    'fileName'(您是否缺少 using 指令或程序集引用?)

      System.IO.File.Copy(sourceFileOpenFileDialog.FileName, consolidatedFolder + @"\" + System.IO.Path.GetFileName(sourceFileOpenFileDialog.FileName)); 
    
  • 'sourceFileOpenFileDialog.FileNames' 无法通过更改为 sourceFileOpenFileDialog.FileName 将类型“string[]”隐式转换为“string”

      textBoxSourceFiles.Text = sourceFileOpenFileDialog.FileName;
    
  • 'sOut' & 'sErr' 在当前上下文中不存在,通过更改关闭语句的位置固定如下。我不确定这是否会弄乱异常捕获器,但我们会看到:

      StreamReader sOut = consolidateFilesProcess.StandardOutput;
      StreamReader sErr = consolidateFilesProcess.StandardError;
      sOut.Close();
      sErr.Close();
    
  • 'sourceFileOpenFileDialog.SelectedFiles' 不包含 'SelectedFiles' 的定义,并且找不到接受 system.windows.forms.openfiledialog 类型的第一个 arg 的扩展方法(您是否缺少 using指令或程序集参考?)。通过将 SelectedFiles 更改为 FileNames 来修复:

      // Text box value declarataions
      private void textBoxSourceFiles_TextChanged(object sender, EventArgs e)
      {
          sourceFileOpenFileDialog.FileName = textBoxSourceFiles.Text;
      }
    

'sourceFileOpenFileDialog.SelectedPath' 不包含 'SelectedPath' 的定义,并且找不到接受 system.windows.forms.openfiledialog 类型的第一个 arg 的扩展方法(您是否缺少 using 指令或程序集引用?)。通过将 SelectedPath 更改为 FileName 来修复:

        if (sourceFileOpenFileDialog.ShowDialog() == DialogResult.OK)
        {
            try
            {
                if ((myStream = sourceFileOpenFileDialog.OpenFile()) != null)
                {
                    using (myStream)
                    {
                        textBoxSourceFiles.Text = sourceFileOpenFileDialog.FileName;
                    }
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-10
    • 2023-03-04
    • 2013-10-07
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    相关资源
    最近更新 更多