我利用API向文件末尾写字符串,执行N次后出现错误(N<10),寻求答案(代码见内)

yuanreid 2001-02-14 09:37:00

HANDLE iFileHandle;
iFileHandle = CreateFile("Error.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE,NULL,
OPEN_ALWAYS,NULL,NULL);
DWORD File_Size;
LPDWORD high_size = new DWORD();
File_Size = GetFileSize(iFileHandle,high_size);

Label1->Caption = "文件大小:"+ IntToStr(File_Size)+" 个字节";

AnsiString test_str = "测试;\r\n";
OVERLAPPED *lpLapped = new OVERLAPPED();
lpLapped->Offset = File_Size;
lpLapped->OffsetHigh = *high_size;

if (!WriteFile(iFileHandle,test_str.c_str(),test_str.Length(),NULL,lpLapped))
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "函数返回错误:", MB_OK | MB_ICONINFORMATION );
delete lpMsgBuf;
}
delete high_size;
free(lpLapped);
CloseHandle(iFileHandle);
...全文
227 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2001-02-15
  • 打赏
  • 举报
回复
tO:yuanreid(闲云孤鹤)
因为使用了OVERLAPPED *lpLapped ,而OVERLAPPED *lpLapped
必须保证所用的指针在完成操作前是完整的,但是test_str.c_str()不能达到这个要求。
「已注销」 2001-02-15
  • 打赏
  • 举报
回复
不用改了,把这段放回原来的就可以了呀

DWORD File_Size;
File_Size = GetFileSize(iFileHandle,NULL);

如果真的要用OVERLAPPED *lpLapped
你必须使用CreateEvent创建一个事件,然后WriteFile完后使用
WaitForSingleObject等待事件结束,太麻烦了,还是不要的好。
而且CreateFile还要加FILE_FLAG_OVERLAPPED参数,555
yuanreid 2001-02-15
  • 打赏
  • 举报
回复
多谢Dinkar和sunboy俩位的热心帮助,我觉得快接近答案了
sundayboys 2001-02-14
  • 打赏
  • 举报
回复
又说错了,今晚究竟怎么了:(
sundayboys 2001-02-14
  • 打赏
  • 举报
回复
Dinkar的代码有个小BUG,将Label1->Caption = "文件大小:"+ IntToStr(File_Size)+" 个字节";改成Label1->Caption = "文件大小:"+ IntToStr(iSize)+" 个字节";就能调试通过了,不过为什么用OVERLAPPED *lpLapped 就不能成功,谁能告诉我?
yuanreid 2001-02-14
  • 打赏
  • 举报
回复
谢谢大家热心帮助,我和许多人研究过这个问题,就是对N次现象很是不解。
为什么会有次数问题呢?
每次都销毁指针了,也不存在资源冲突问题。 很是费解。
sundayboys 2001-02-14
  • 打赏
  • 举报
回复
sorry,我刚才说错了,但WriteFile函数总是不成功,老是报告参数出错,看了半天,还是不知道哪儿出错了。
yuanreid 2001-02-14
  • 打赏
  • 举报
回复
如何用 OVERLAPPED *lpLapped 来完成此项工作呢?
「已注销」 2001-02-14
  • 打赏
  • 举报
回复
简单说改成下面的就可以拉:

HANDLE iFileHandle;
DWORD iSize;
iFileHandle = CreateFile("Error.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE,NULL,
OPEN_ALWAYS,NULL,NULL);

Label1->Caption = "文件大小:"+ IntToStr(File_Size)+" 个字节";

AnsiString test_str = "测试;\r\n";

SetFilePointer(iFileHandle,0l,NULL,FILE_END);

if (!WriteFile(iFileHandle,test_str.c_str(),test_str.Length(),&iSize,NULL))
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "函数返回错误:", MB_OK | MB_ICONINFORMATION );
delete lpMsgBuf;
}
CloseHandle(iFileHandle);
「已注销」 2001-02-14
  • 打赏
  • 举报
回复
LPDWORD high_size = new DWORD();
可以用DWORD high_size;
OVERLAPPED *lpLapped = new OVERLAPPED();
可以不用
加个
DWORD lsize;

if (!WriteFile(iFileHandle,test_str.c_str(),test_str.Length(),NULL,lpLapped))
该成
if (!WriteFile(iFileHandle,test_str.c_str(),test_str.Length(),&lsize,NULL))


File_Size = GetFileSize(iFileHandle,high_size);
后面加个
SetFilePointer(iFileHandle,0l,NULL,FILE_END);

yuanreid 2001-02-14
  • 打赏
  • 举报
回复
已经是指针了 AnsiString的c_str就是 char*
sundayboys 2001-02-14
  • 打赏
  • 举报
回复
我只要执行一次,就报告参数错误,好像是WriteFile函数参数出错,第二个参数看帮助应该是个指针的。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧