为什么在 C# 中解压缩文件会为下一个文件操作创建 UnauthorizedAccessException?

问题描述 投票:0回答:2

尝试整理我的代码,因此我将处理用户选择要解压缩的文件的方法移至中央 fileops 类中。它现在抛出 UnathorizedAccessException,我无法弄清楚。

工作流程是用户通过 FileOps.UnzipFile() (由我的 ViewModel 调用)选择他们想要查看的压缩日志文件,将其解压缩,然后 FileOps.UnzipFile() 返回解压缩文件的位置。

但是,当 ViewModel 尝试:

var lines = File.ReadLines(unZippedFilePath); //read the unzipped file
我收到 UnauthorizedAccessException...

ViewModel 看起来像这样:

private void ProcessLogFile(object parameter)
        {

            
            string unZippedFilePath =  WGFileOperations.UnzipFile();


            var lines = File.ReadLines(unZippedFilePath); //read the unzipped file

            foreach (var lineCheck in lines)
            {

            /* do a bunch of stuff  */
                
            }

            //BORING STUFF OMMITED
}

WGFileOperations.UnzipFile() 方法如下所示:

public static string UnzipFile()
        {

            OpenFileDialog openFileDialog = new OpenFileDialog();
            string _filePath = null;

            if (openFileDialog.ShowDialog() == true)
            {
                _filePath = openFileDialog.FileName;
            }

            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.FileName = Path.GetFileNameWithoutExtension(_filePath);

            saveFileDialog.RestoreDirectory = true;


            string extractPath = @"C:\Orica\UnpackedFiles\" + _filePath; //default extractpath


            if (saveFileDialog.ShowDialog() == true)
            {
                extractPath = saveFileDialog.FileName;
            }
           
            if (File.Exists(extractPath) == false)
            {
                try
                {
                    ZipFile.ExtractToDirectory(_filePath, extractPath);
                    MessageBox.Show("File Created Ok I Guess Because I Didn't Throw An Exception!");
                    
                }

                catch (Exception ex)
                {
                    MessageBox.Show("Error attempting to extract file! " + ex);
                }
            }
            else
            {
                MessageBox.Show("That file already exists");
            }

            return extractPath;

        }

那么有什么想法可能会发生这种情况以及我能做些什么吗?当我在 ViewModel 中有 WGFileOps.UnzipFile() 方法时,它工作正常...

c# exception unzip
2个回答
0
投票

尝试使用 FileStream 来完成此操作,如下所示:

 using (FileStream zipToOpen = new FileStream(path, FileMode.Open))
 {
     using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Read))
     {
         foreach (ZipArchiveEntry entry in archive.Entries)
         {
             if (entry.FullName.EndsWith(".txt", StringComparison.InvariantCultureIgnoreCase))
             {
                 using (var stream = entry.Open())
                 using (var reader = new StreamReader(stream))
                 {
                     string line;
                     while((line = reader.ReadLine()) != null)
                     {
                          // read your lines here
                     }  
                 }
             }
         }
     }
 }


0
投票

克劳斯解决了这个问题: “ExtractToDirectory 将创建一个具有给定名称的目录并将解压缩的文件放入其中。因此您的 unZippedFilePath 是目录路径,而不是文件路径”。

我向我的方法返回一个目录路径,该方法正在寻找文件路径。结果我得到了访问异常。为了解决这个问题,我插入了一些代码来获取实际的文件路径,然后将其传递给我的方法。现在一切都运行良好,我的生活感觉更好了,因为我知道我的代码更干净了;-)

© www.soinside.com 2019 - 2024. All rights reserved.