【问题标题】:parsing a path using a functoin called getfullpathname() in C?在 C 中使用名为 getfullpathname() 的函数解析路径?
【发布时间】:2019-08-22 22:05:20
【问题描述】:

我是 C 的初学者,目前必须学习 C 和 Win32 API,在我的第一个项目中,我需要从用户那里获取路径名和文件名,然后检查文件是否存在并在用户需要时将其删除到。

我目前卡在查找文件是否存在。 我熟悉之前在此站点中显示的解决方案 (What's the best way to check if a file exists in C?),但我被提示/指示使用名为 getfullpathname() 的函数来解析字符串,然后检查输入的文件是否存在。 我的问题是,就我搜索(试图了解 MSDN 和几个或更多站点)而言,所有 GetFullPathName 所做的都是将工作驱动器和目录连接到您提供的文件名上。 我错过了什么吗?我是否需要将工作目录更改为输入的路径以连接路径和名称文件,或者只是将路径传递给函数以解析它,以便我能够进行检查? 我是否需要此函数仅用于解析路径或连接路径字符串和名称字符串? 你能提供我做这个项目第一部分的例子吗?

提前致谢。

【问题讨论】:

  • 必须遵循 我需要从用户那里获取路径名和文件名 并且 我已被提示/指示使用名为 getfullpathname() 的函数你说得对我需要将工作目录更改为输入的路径......即使这很复杂(因为你必须遵守规则)^^跨度>
  • 检查文件是否存在使用GetFileAttributes,但在大多数情况下 - 根本不需要检查。想要删除文件 - 就这样做。如果文件不存在 - 你会得到这样的错误。
  • @RbMm 我知道,但是这个函数的使用是为了练习,它比C更关注winapi。
  • 所以使用GetFileAttributes 检查文件是否存在
  • 练习的想法是应该写GetFullPathName()吗?

标签: c windows visual-studio winapi


【解决方案1】:

将工作驱动器和目录连接到您提供的文件名上。

不是简单的拼接,这个函数不检查文件是否存在,只是将文件的相对路径(不管文件是否存在)解析为绝对路径。函数GetFullPathName的第一个参数是你需要放入的文件的相对路径。如果文件位于当前工作目录下,你只需要将filename发送给函数调用即可。如果文件位于上层路径,则可以发送../filename,函数会将其解析为绝对文件路径。

您可以使用GetShortPathName。如果文件不存在,则调用失败,返回0。

【讨论】:

    【解决方案2】:

    嗯,根据我的习惯

    假设文件位于当前工作目录中,GetFullPathName 听起来是个好主意。它接受文件名并通过预设当前工作目录将其转换为完整路径。

    注意:无论文件是否存在,API都会返回一个路径 是否在工作目录中;它只使用你的文件名 提前提供并准备好当前工作目录。

    演示1:

    #include <windows.h>
    
    int main()
    {
       char filename[] = "test.txt";
       char fullFilename[MAX_PATH];
       GetFullPathName(filename, MAX_PATH, fullFilename, nullptr);
       MessageBox(NULL, fullFilename, "DEBUG", MB_OK);
    }
    

    调试结果:

    其实没有测试。 txt 文本文件。

    所以你可以通过以下方式做到这一点

    演示2:

    #include <windows.h>
    
    int main()
    {
       char lpszPath[] = "..\\Project20";
       long     length = 0;
       TCHAR*   buffer = NULL;
    
       buffer = new TCHAR[length];
       length = GetShortPathName(lpszPath, buffer, length);
    
       if (length == 0)
       {
         MessageBox(NULL, "ERROR", "DEBUG", MB_OK);
       }
       else
       {
         MessageBox(NULL, "SUCCESS", "DEBUG", MB_OK);
       }
       delete[] buffer;
    
       return 0;
    }
    

    通过ERROR和SUCCESS判断文档是否存在

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多