C# - WinForms 应用程序上的 StreamReader SecurityException 处理 OpenFileDialog 相关错误

标签 c# winforms error-handling streamreader openfiledialog

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

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

  • ' sOut ' 在当前上下文中不存在
  • ' 服务端 ' 在当前上下文中不存在
  • ' sourceFileOpenFileDialog.SelectedFiles ' 不包含 'SelectedFiles' 的定义,并且找不到接受 system.windows.forms.openfiledialog 类型的第一个 arg 的扩展方法(您是否缺少 using 指令或程序集引用?)
  • ' sourceFileOpenFileDialog.SelectedPath ' 不包含 'SelectedPath' 的定义,并且找不到接受 system.windows.forms.openfiledialog 类型的第一个 arg 的扩展方法(您是否缺少 using 指令或程序集引用?)
  • ' 安全异常 ' 找不到(您是否缺少 using 指令或程序集引用?)
  • ' 处理 ' 找不到(您是否缺少 using 指令或程序集引用?)
  • ' 文件名 ' 找不到(您是否缺少 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 
    

    最佳答案

    解决您的错误

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

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

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

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

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

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

    sOut 服务端 您在流程的后期设置它们并在您的最终声明中清理它们,可能发生的情况是如果流程在您到达您的
    StreamReader sOut = covertFilesProcess.StandardOutput;
    StreamReader sErr = covertFilesProcess.StandardError;
    

    那么当你点击finally时,它不知道是什么 sOut 服务端 关闭是,因为它们还没有被制造出来。

    关于C# - WinForms 应用程序上的 StreamReader SecurityException 处理 OpenFileDialog 相关错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5378122/

    相关文章:

    c++ - 发生错误时在 if/else block 之间切换

    php - 无法获取 $_SESSION 变量

    soap - 发生SOAP错误时会发生什么?

    c# - 在 Visual Studio 2017(版本 15.5.1)中隐藏 XML 注释

    C# winforms 组合框动态自动完成

    C# RichTextBox 移除自定义 SelectionBackColor

    c# 如何允许同一用户多次登录,但限制为一定数量

    c# - 'Microsoft.WindowsAzure.Storage.CloudStorageAccount' 的类型初始值设定项在 Xamarin.forms 中抛出异常错误

    c# - 如何从外部文件显示 C# 源代码?

    c# - 使用 .NET SDK 从 Azure 文件共享下载空文件时出现 InvalidRange 错误