【问题标题】:check if file exists, case sensitive in C检查文件是否存在,C中区分大小写
【发布时间】:2021-12-03 15:37:43
【问题描述】:

在 Windows 上用 C 语言检查文件是否存在区分大小写的好方法是什么?

我通过将文件名与文件名目录中的所有文件条目进行比较来实现这一点。 C中有更有效的方法吗?

【问题讨论】:

  • 查看FindFirstFile函数。
  • 为什么?这样做你几乎肯定会成为creating a TOCTOU bug。执行任何动作 X 以查看其他动作 Y 是否有效是一个坏主意。仅仅因为 X 在您尝试它的确切时间工作,这并不意味着 Y 将在以后工作。因此,当您稍后尝试执行 Y 时,您仍然必须编写所有最初不执行 X 时会编写的错误处理代码。因为 X 不是 Y,所以它们不一样,并且不同的规则适用于不同的操作。
  • Windows 文件系统不区分大小写,所以...我不确定您是否可以这样做。
  • 如果文件所在的文件系统不区分大小写,那么名为“ASDF”的文件就是名为“asdf”的文件.
  • @AndrewHenle yes on Windows "ASDF" 是文件名为“asdf”,但出于某种原因(有效与否,我们不知道细节)OP需要知道文件是否以精确的大小写存在。

标签: c windows winapi case-sensitive


【解决方案1】:

使用这个:

WIN32_FIND_DATAA FindFileData;
HANDLE h = FindFirstFile(filenametocheck, &FindFileData);

现在FindFileData.cFileName 包含文件名,因为它存储在 NTFS 中。

您只需将filenametocheck 与FindFileData.cFileName 进行比较。

不要忘记用FindClose(h) 关闭h 句柄并进行错误检查。

这仅适用于检入当前目录,如果filenametocheck 包含路径(例如..\somefile.txt 或C:\\Somedir\Somefile.txt),您需要做更多的工作。

有关更多详细信息,请阅读FindFirstFile 的文档并可能查看this sample。

请注意,根据您想要实现的具体目标,这可能会导致评论中提到的TOCTOU bug。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2013-06-21
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多