我已使用以下内容获取文件句柄:
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文件写入指定目录?
答案 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";