调整文件大小(向下)

时间:2009-12-16 00:47:46

标签: c++ windows winapi file-io

我正在尝试缩小文件。
我正在用另一个文件替换一个文件的内容,当我完成时我想确定源文件是否小于dest文件,dest文件正确收缩。

(为什么:因为dest文件是备份文件并且写入媒体非常昂贵,所以我只将备份写入备份)

1.) HANDLE hDest =(HANDLE)_get_osfhandle( fileno(backupFile.GetBufferedHandle()) );
2.) DWORD startingSize = GetFileSize(hDest, NULL);
3.) DWORD dwPtr = SetFilePointer(hDest, newSize, NULL, FILE_BEGIN);
4.) int err = GetLastError();
5.) if (dwPtr != INVALID_SET_FILE_POINTER)
6.) {   err = SetEndOfFile(hDest); 
7.)     if(err == 0) 
8.)         err = GetLastError();
9.)     err = SetFileValidData(hDest, newSize);
10.) }
11.) DWORD endingSize = GetFileSize(hDest, NULL);

我在第8行遇到错误1224 ...我想知道是否有人可以告诉我原因,或建议更好的方法。

3 个答案:

答案 0 :(得分:3)

“net helpmsg 1224” - >无法对打开了用户映射部分的文件执行请求的操作。

来自MSDN的SetEndOfFile

  

如果调用CreateFileMapping   为。创建文件映射对象   hFile,必须调用UnmapViewOfFile   首先取消映射所有视图并调用   CloseHandle关闭文件映射   你可以打电话之前的对象   SetEndOfFile。

答案 1 :(得分:0)

该错误转换为The requested operation cannot be performed on a file with a user-mapped section open.

您是否有该文件的任何内存映射段?

答案 2 :(得分:-2)

您的错误代码为0表示成功(ERROR_SUCCESS)并且确实有效,请参阅您提供的示例中的第6行。现在为什么你在第7行检查后立即拨打GetLastError?顺便说一句,我认为您应该使用ERROR_SUCCESS而不是0.可以找到错误代码的引用here。或者你的意思是它发生在第9行?

你能证实吗? 希望这可以帮助, 最好的祝福, 汤姆。