如何使用Win32 API指定要使用WriteFile写入文件的目录?

时间:2014-11-13 02:29:16

标签: winapi bitmap writefile

我已使用以下内容获取文件句柄:

char *filePathAndName = "C:\Projects\pic.bmp";
HANDLE hFile = CreateFile(_T(filePathAndName),GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

我已使用以下内容编写文件:

WriteFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, (LPSTR)lpbitmap, dwBmpSize, &dwBytesWritten, NULL);

但是,该文件会写入项目目录(即Microsoft Visual Studio解决方案文件所在的位置),而不是写入C:\ Projects \目录。

如何将.bmp文件写入指定目录?

2 个答案:

答案 0 :(得分:4)

_T()宏只能与文字一起使用(与TEXT()宏相同)。而且你没有逃避字面上的斜线。

C运行时使用_T()宏。 Win32 API使用TEXT()宏。你不应该混合它们,即使它们有效地做同样的事情。对正在使用的API使用正确的宏。

在致电LPSTR时,您不需要将数据输入到WriteFile()

请改用:

LPTSTR filePathAndName = TEXT("C:\\Projects\\pic.bmp");
HANDLE hFile = CreateFile(filePathAndName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
...
WriteFile(hFile, &bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, &bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, lpbitmap, dwBmpSize, &dwBytesWritten, NULL);

话虽如此,通常您应该通过GetSaveFileName()IFileSaveDialog提示用户输出文件名。或者,如果您想使用自己的文件名,至少使用SHBrowseForFolder()(或IFileSaveDialog,也支持选择文件夹)提示目标文件夹。

答案 1 :(得分:3)

这是你的问题:

char *filePathAndName = "C:\Projects\pic.bmp";

字符串或字符文字中的反斜杠表示特殊字符。例如,\t代表标签,\n代表换行符。编译器应该抱怨\P\p无效。

如果你有一个包含真实反斜杠的字符串,你需要加倍它们:

char *filePathAndName = "C:\\Projects\\pic.bmp";