【问题标题】:System.IO.IOException: 'The handle is invalid. : '\\.\Con''System.IO.IOException: '句柄无效。 : '\\.\Con''
【发布时间】:2020-09-07 10:08:21
【问题描述】:

我有一个 WPF NET 核心应用程序并尝试在本地写入文件。

var movies = await GetMovies(_settings.MovieFolderId);
foreach (var movie in movies)
{
      Message = $"Writing locally {movie.Name}";
    
      var meta = Path.Combine(pathToSave, $"{movie.Name}.meta");
      if (!File.Exists(meta))
      {
        await File.WriteAllTextAsync(meta, $"{movie.Id}\r\n{movie.Parents?.FirstOrDefault() ?? string.Empty}");
      }
}

我得到了:

meta 的值为:C:\p\bds\Con.Air.A-MVIE.meta

为什么?该迭代中的所有文件都不会发生这种情况。

【问题讨论】:

  • 在 Windows 中,您无法保存名称为 con 的文件。 superuser.com/q/86999/263134
  • 为了扩展 Bizhan 的评论,在 Windows 上,con(以及 nul 和其他一些)不能出现在路径中任何地方,并且不能形成没有扩展名的文件名基础。见docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
  • 有页面这样说?
  • @KonradRudolph 不是在任何地方,你可以有sth.con.txt,但不能有con.txtcon.sth.txt
  • 使用@"\\?\" + meta。该前缀禁用 win32 名称规范化

标签: c# wpf .net-core


【解决方案1】:

是的,因为 cmets 说“骗局”是不允许的。 以下是 Microsoft Doc 摘录:

不要使用以下保留名称作为文件名:

CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8 和 LPT9

https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN

【讨论】:

  • +1 表示 MSDN 链接,也可以解释一下为什么 Con.Air.A-MVIE.meta 属于该类别。由于文件名是Con.Air.A-MVIE 而不是con
  • MSDN 链接进一步说:还要避免这些名称后跟扩展名;例如不推荐使用 NUL.txt
  • @SnakeEyes windows 文件系统不区分大小写,但它包含Con.Air.A-MVIE 的原因正如@gkulshrestha 提到的那样,保留名称不应紧跟扩展名(这仍然没有做到最终,因为AirA-MVIE 都不是扩展,meta 是)
猜你喜欢
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多