首页 > 解决方案 > 压缩器/解压缩器 .Net Core 控制台程序中的“System.IO.FileNotFoundException”

问题描述

我正在 Visual Studio 2017 中制作压缩器/解压缩器控制台程序,我想通过将输入文件拖到控制台 (.txt) 来获取文件路径。

我得到了 Compress() 的 inputStream 的正确路径,但 outPutStream 失败并且找不到文件路径(FileMode.OpenOrCreate!?!),即使路径是硬编码的。

如果两个变量都被硬编码,程序将正确执行,但我不明白为什么 System.IO.FileNotFoundException 是通过从将文件拖到控制台获取输入文件并硬编码输出文件而引发的。

  ....
 string outPutFileName = @"C:\bla\bla\bla\bla\gergrgr.gzip";        
 public static void Compress(string inPath)
    {


            using (FileStream inputStream = new FileStream(inPath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                using (FileStream outputStream = new FileStream(outPutFileName, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    using (GZipStream gzip = new GZipStream(outputStream, CompressionMode.Compress))
                    {
                        inputStream.CopyTo(gzip);                            
                    }
                }
            }
        }

    static void Main(string[] args)
    {          
        string outPutFileName = @"C:\bla\bla\bla\bla\gergrgr.gzip";

        //dummy var, cant find a better way to add '@' to variable set by console.readline
        string filePath = @"test";

        // info info info....
        Console.WriteLine("Drag in txt file");

        // Takes the path from dragged in file
        string idk = Console.ReadLine();

        // instead of of a loop to escape "/", just replace text in filePath
        filePath = filePath.Replace("test", idk);



        Compress(filePath);  

    } 

标签: c#.netcompressionconsole-application

解决方案


我认为问题实际上是您的应用程序无权写入指定的输出位置。检查FileMode.OpenOrCreate的文档

如果文件访问权限为 FileAccess.Write,则需要写入权限。

以下对我有用:

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApp1
{
    internal class Program
    {
        private static readonly string outPutFileName = @"C:<my desktop directory>\gergrgr.gzip";

        public static void Compress(string inPath)
        {
            using (var inputStream = new FileStream(inPath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                using (var outputStream = new FileStream(outPutFileName, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    using (var gzip = new GZipStream(outputStream, CompressionMode.Compress))
                    {
                        inputStream.CopyTo(gzip);
                    }
                }
            }
        }

        private static void Main(string[] args)
        {
            // info info info....
            Console.WriteLine("Drag in txt file");

            // Takes the path from dragged in file
            var filePath = Console.ReadLine();
            if (!string.IsNullOrEmpty(filePath))
            {
                Compress(filePath.Trim('\\', '"'));
            }
        }
    }
}

推荐阅读