c - 关于有效文件路径的问题

标签 c windows createfile

我正在使用以下代码创建文件,但它总是失败,错误代码为 123(路径语法无效)。

奇怪的是:path_ok总是ok,但是path_err总是失败,123。失败后,path_err的缓冲区指向被清除。

谁能给我一些启发?我检查了2个指针的内存,它们的内容似乎是相同的。

非常感谢。

 WCHAR *pDumpFileName = ComposeDumpFileName();
 WCHAR *path_ok = _T("d:\\myapp_Utopia_2010-11-15_04-22-05.dmp");
 WCHAR *path_err = pDumpFileName;
 ::wprintf(pDumpFileName);
 HANDLE hFile = ::CreateFileW( pDumpFileName, GENERIC_READ | GENERIC_WRITE, 
  0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

ComposeDumpFileName() 函数是这样的:

WCHAR* ComposeDumpFileName(void)
{
 // get the time
    SYSTEMTIME sys_time;
    ::GetSystemTime(&sys_time);

    // get the computer name
    WCHAR computer_name[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD computer_name_len = ARRAYSIZE(computer_name);
 ::GetComputerNameW(computer_name, &computer_name_len);

    // build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP
    WCHAR dump_file_path[MAX_PATH];

 ::swprintf_s(dump_file_path, ARRAYSIZE(dump_file_path), 
        _T("d:\\myapp_%s_%04u-%02u-%02u_%02u-%02u-%02u.dmp"), 
        computer_name, sys_time.wYear, sys_time.wMonth, sys_time.wDay,
        sys_time.wHour, sys_time.wMinute, sys_time.wSecond);

 return dump_file_path;
}

更新

在我上面的代码中,当我执行下面的代码时:

WCHAR *pDumpFileName = ComposeDumpFileName();

ComposeDumpFileName返回后,其栈帧失效,但其局部变量WCHAR dump_file_path[MAX_PATH]仍然存在于栈中。所以这就解释了为什么我仍然可以看到它的内容,尽管它的堆栈空间已经无效了。

然后我执行下面的语句:

     ::wprintf(pDumpFileName);
     HANDLE hFile = ::CreateFileW( pDumpFileName, GENERIC_READ | GENERIC_WRITE, 
      0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

wprintf() 和 CreateFileW() 有自己的栈帧。虽然在调试器中,我发现 wprintf() 的堆栈帧没有破坏 pDumpFileName 指向的内存内容,但 CreateFileW 可能有,所以它提示无效的路径语法。

这是我目前的理解,如有错误请指正

谢谢。

最佳答案

您的代码的一个主要问题是您返回的缓冲区在堆栈上,这是一个很大的禁忌:

 // build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP 
 WCHAR dump_file_path[MAX_PATH]; 

要么将其更改为静态:

 // build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP 
 static WCHAR dump_file_path[MAX_PATH]; 

或将缓冲区传递给函数。

关于c - 关于有效文件路径的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4181701/

相关文章:

c - C 中的双重自由或腐败 3d 数组

c - pthread_cancel() 在传入类型转换的 void 指针时不起作用

windows - 分组 gridView 中的不同项目大小

c++ - MS Detours Express 3.0 没有正确挂接 CreateFile win32 API 函数

c++ - 在 C++ 中创建一个文件,就像按右键->新建->新建文本文档一样

c# - 无法并行读取同一个文件

iphone - 调用宏

c - 如何将ULONG复制到PUCHAR中

c++ - 读\写 boost::binary_oarchive 到管道

windows - 查找网络驱动器的 UNC 路径?