【问题标题】:C# Can't find fileC#找不到文件
【发布时间】:2012-08-02 04:09:45
【问题描述】:

我有一个 C# Visual Studio 2008 表单,它需要读取相关文件 'character/attacks.txt' 的内容 File.Exists() 在我运行它时返回 false,即使我确定我的目录已排序.代码:

            try
            {
                System.IO.StreamReader file = new System.IO.StreamReader("character/attacks.txt");
                int counter = 0;
                int numberOfLines = 0;
                string line;
                while ((line = file.ReadLine()) != null) { numberOfLines++; }
                string[] attacks = new string[numberOfLines];
                while ((line = file.ReadLine()) != null) { attacks[counter] = line; counter++; }
                file.Close();
                print(attacks.ToString());
            }
            catch (Exception ex) 
            {
                print("ERROR"); print("Did you edit any files?"); print(ex.ToString()); 
            }

异常错误:

System.IO.FileNotFoundException: Could not find file 'D:\Users\Andrey\Desktop\Turn\character\attacks.txt'.
File name: 'D:\Users\Andrey\Desktop\Turn\character\attacks.txt'
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
   at System.IO.StreamReader..ctor(String path)
   at TurnByTurn.Form1.button1_Click(Object sender, EventArgs e) in D:\Users\Andrey\Desktop\C#\TurnByTurn\TurnByTurn\Form1.cs:line 52

我正在从 Python 移植我的代码,并且从未遇到过任何问题。提前致谢!

【问题讨论】:

  • 你确定文件存在这里吗:D:\Users\Andrey\Desktop\Turn\character\attacks.txt
  • 是的,确实如此。我什至把characters文件夹放到debug文件夹下,还是不行。
  • 嗯,这很奇怪。计算机似乎坚信“D:\Users\Andrey\Desktop\Turn\character\”目录中没有“attacks.txt”文件,但您说有。你们中的一个一定是错的。您确定您的文件实际上具有 .txt 扩展名,而不是 .txt.somethingelse 扩展名吗?如果你在 Windows shell 中关闭了文件扩展名,你可能会错过这个。这是同样的问题this guy had
  • @CodyGray 谢谢!我的文件是 Attacks.txt.txt 如果您将评论添加为答案,我会标记它。
  • 很高兴工作;我添加了一个答案。

标签: c# visual-studio-2008 file-io


【解决方案1】:

这很奇怪。电脑似乎坚信D:\Users\Andrey\Desktop\Turn\character\目录下没有attacks.txt文件,但你说它肯定存在。你们中的一个人一定是错的,多年来我了解到计算机比我更经常是正确的。

您确定您的文件实际上具有.txt 扩展名,而不是.txt.somethingelse 扩展名吗?如果您在 Windows shell 中关闭了文件扩展名的显示,您可能会丢失这个额外的文件扩展名。但是,计算机内部并没有丢失它,并且它认为这是一个与您请求的文件完全不同的文件。这与this guy 遇到的问题相同。

要重新配置 Windows 资源管理器:

  1. 打开控制面板文件夹。
  2. 点击“文件夹选项”。
  3. 切换到“查看”标签。
  4. 在“高级设置”列表框中的项目列表中找到“显示隐藏的文件、文件夹和驱动器”单选按钮,并确保它已被选中。
  5. 点击确定。

这个问题的其他答案确实提出了一些很好的建议。其中:

  1. 确保如果您在字符串文字中使用反斜杠(这是标准的 Windows 路径分隔符),则使用第二个反斜杠“转义”它们。需要这样做的原因是反斜杠被 C# 编译器解释为转义字符,它允许您键入 \t 之类的内容来插入制表符。如果要插入常规反斜杠,则必须转义转义符—\\。这就是您在尝试使用单个反斜杠时遇到错误的原因。

  2. 除了转义反斜杠字符外,您还可以告诉 C# 编译器在键入时准确 解释您的字符串文字,包括空格。这些被称为verbatim string literals。为此,您可以在字符串前面加上 @ 字符。例如:@"C:\MyDirectory\MyFile.txt"

  3. 您现在使用的正斜杠字符之所以有效,完全是出于向后兼容的原因。这不是错误的原因(正如您从异常消息中看到的那样,其中包括正在搜索的路径),但在路径中使用正斜杠可能仍然不是一个好主意。正如我上面提到的,反斜杠是 Windows 中的标准路径分隔符。

【讨论】:

    【解决方案2】:

    这是因为您创建了一个文本文件,所以它自动带有 .txt 扩展名。因此,如果您故意添加 .txt,那么该文件现在实际上是 Attacks.txt.txt。

    【讨论】:

      【解决方案3】:

      我认为因为您的文件名中有一个“\”,所以它可能会弄乱它并告诉它在字符文件夹中查找 Attacks.txt 文件。

      edit:或者至少看起来你告诉它你的文件中有一个斜线。它在错误中为您提供的文件路径是您机器上文件的实际位置吗?

      【讨论】:

      • 我将 '/' 替换为 '\' 并且出现无效字符错误。
      • 您可以使用 2 斜线选项,这也是为您的项目查找和使用工作目录的更好做法:string applicationDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); string filename = System.IO.Path.Combine(applicationDirectory, "character\\attacks.txt"); 这只是一个改进,看起来双斜线将解决您的直接问题。
      • 为什么使用反射来确定应用程序的可执行文件的路径,而不是像他已经在做的那样仅仅使用相对路径会是一个更好的解决方案?
      • 你的权利@CodyGray 不是更好,但如果由于某种原因他们的应用程序在查找文件时遇到问题,这可能是另一种获取路径的方式吗?
      • 不,它最终会做同样的事情。当然,除非工作目录与应用程序目录不同。这在理论上当然是可能的,但这里并非如此,正如您从包含文件路径的异常消息中看到的那样。无论如何,硬编码路径无论如何都不是一个好主意,因此争论“正确”或“最佳”的方式没有太大意义!
      【解决方案4】:

      是的,如果您将“/”替换为“\”,则会出现无效字符错误。 用 2 个斜线试试这个

      System.IO.StreamReader file = new System.IO.StreamReader("character\\attacks.txt");
      

      System.IO.StreamReader file = new System.IO.StreamReader(@"character\attacks.txt");
      

      【讨论】:

        【解决方案5】:
        1. Posix 中的路径拆分器为 /Windows 中的路径拆分器为 \
        2. 使用Directory.GetCurrentDirectory 确保当前目录正确。
        3. 如果当前目录不正确,请使用完整路径或将当前目录更改为Directory.SetCurrentDirectory

        【讨论】:

          【解决方案6】:

          这会很好用......

           string fileName = file_name+".pdf";
                          string files = System.IO.Path.Combine("pdf/") + fileName;
                          if (!System.IO.File.Exists(files))
                          {
                              return RedirectToAction("index", new { message = "File Not Found" });
          
                          }
                          else
                          {
          
                              byte[] fileBytes = System.IO.File.ReadAllBytes(files);
                              return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, files);
          
                          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-08-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多