【问题标题】:File.Create() method fails when part of path does not exist [duplicate]当部分路径不存在时,File.Create() 方法失败[重复]
【发布时间】:2019-05-27 14:55:00
【问题描述】:

作为项目练习的一部分,我一直在编写一个简单的控制台应用程序。任务相当简单:

第二种方法必须创建嵌套目录树,其中每个文件夹名称都是 Guid。

第三种方法必须将空文件放在特定级别的选定目录树中。

我的主要问题在于第三种方法。因为虽然它可以正常工作并创建文件直到任何目录的第三级,但在此之后它总是抛出 "System.IO.DirectoryNotFoundException" - 因为它“找不到路径的一部分”。

我使用字符串作为路径的容器,但是由于它很少设置 Guid,所以它变得很长。我在创建目录时遇到了类似的问题,但为了工作,我必须简单地将 @"\?\" 前缀放在路径后面。那么有什么方法可以让它工作,或者可以解决这个问题?

这是失败的方法。具体来说是

File.Create(PathToFile + @"\blank.txt").Dispose();

以及生成字符串并调用它的部分代码:

string ChosenDirectoryPath = currDir.FullName + @"\";

for (int i = 0; i <= Position; i++)
{
   ChosenDirectoryPath += ListsList[WhichList][i];
}
if (!File.Exists(ChosenDirectoryPath + @"\blank.txt"))
{
   FileMaker(ref ChosenDirectoryPath);
}

编辑:

具体来说,目录是按方法制作的:

public List<string> DirectoryList = new List<string>();
internal static List<List<string>> ListsList = new List<List<string>>();
private static DirectoryInfo currDir = new DirectoryInfo(".");
private string FolderName;
private static string DirectoryPath;

public void DeepDive(List<string> DirectoryList, int countdown)
{
   FolderName = GuidMaker();
   DirectoryList.Add(FolderName + @"\");

   if (countdown <= 1)
   {
      foreach (string element in DirectoryList)
      {
         DirectoryPath += element;
      }

      Directory.CreateDirectory(@"\\?\" + currDir.FullName + @"\" + DirectoryPath);
      Console.WriteLine("Folders were nested at directory {0} under folder {1}\n", currDir.FullName, DirectoryList[0]);

      ListsList.Add(DirectoryList);
      DirectoryPath = null;

      return;
   }
   DeepDive(DirectoryList, countdown-1);
}

由于递归,这很混乱(迭代会更好,但我想这样做是为了学习一些东西)。重点是创建目录并将其存储在列表列表中。

创建文件可以正常工作,但仅适用于前三个嵌套文件夹。所以问题是它以某种方式丢失了它在第 4 和第 5 级的文件路径,甚至无法手动制作这些文件。会不会是路太长了?以及如何解决这个问题。

这是抛出的异常:

System.IO.DirectoryNotFoundException: „找不到路径的一部分 “C:\ \ More \ folorers \ 1b0c7715-EE01-4DF8-9079-82A7990030F \ C6C806B0-B69D-4A3A-88D0-1BD8A0E31EB2 \ 9671F2B3-3041-42D5-B631-4719D36C2AC5 \ 6406F00F-7750-4B5A-A45D-CEBCECB0B70E \ bcacef2b-e391-4799-b84e-f2bc55605d40\blank.txt”。”

所以它抛出了文件的完整路径,却说找不到。

【问题讨论】:

  • currDir.FullName + @"\" + @"\blank.txt" 不会在你的路径上给你两个 \ 吗?您应该使用 Path.Combine(path1,path2) 来合并路径和如果两个路径都包含“\”则可以复制的“\”
  • 感谢您指出,一旦我弄清楚如何使用它,我会尝试,但现在我更关心的是我实现它的方式,但只有对于不超过第三个文件夹的目录。

标签: c# createfile


【解决方案1】:

你的问题是File.Create 没有为你创建相应的目录,而是抛出一个System.IO.DirectoryNotFoundException

您必须自己创建这些目录,使用 System.IO.Directory.CreateDirectory()


如果由于路径太长而发生此异常,您仍然可以像创建目录时一样使用“长路径语法 (\\?\)”。

另见这个问题:How to deal with files with a name longer than 259 characters? 还有一个很好的article 链接

【讨论】:

  • 感谢您的回答,但这些目录是由我未在此处发布的另一种方法较早创建的。正如您所建议的那样,此方法使用System.IO.Directory.CreateDirectory(),实际上我可以创建一些文件,但只能在嵌套深度不超过第 3 级的目录中。当我得到异常时,它会显示我想要制作此文件的位置的准确路径,但它不会创建它。即使我手动提供路径,它仍然会引发该错误。
  • @Raczy 这很奇怪,因为您提到的路径没有超过任何限制。我用完全相同的路径尝试了File.Create,一切对我来说都很好。您是否 100% 确定所有目录都存在?
  • 我再次仔细查看了整个路径,一切似乎都很好。我决定手动进行,逐步创建每个文件。因此,对于前三个嵌套文件,一切正常。正在通过复制粘贴并使用文件资源管理器检查它以确保路径相同,并且再次发生相同的问题。在第 4 和第 5 个嵌套目录(VS 处于管理模式)抛出不完整路径的异常。我想我会通过的。也许这只是我个人的问题。然而,这似乎很奇怪。无论如何感谢您的努力
  • @Raczy 我查看了您的 github 存储库并在那里找到了您的源代码,基于此我已经编辑了我的答案,希望对您有所帮助
  • 那是一位真正的英雄,非常感谢您的付出!
猜你喜欢
  • 1970-01-01
  • 2020-08-16
  • 2011-07-10
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 2015-08-10
相关资源
最近更新 更多