如何判断写文件结束?
发布网友
发布时间:2023-06-26 17:09
我来回答
共6个回答
热心网友
时间:2024-11-05 19:06
这个问题太好解决了,有几种方法
方法1,使用windows.h里的全局共享Mutex
如果是在windows里面可以用创建Mutex的方法
即,第一个发送进程开始时就建立一个Mutex
然后开始写文件,写完文件然后删除掉Mutex.
第二个进程一直创建一个和第一个进程相同的Mutex,由于是同名,肯定是创建失败。如果失败继续尝试并等待直到第一个进程删除Mutex,则二号进程创建成功,就可以打开文件并发送了.
方法2 更简单,加一个标志文件S,即第一个进程开始读文件读完文件后,创建一个特别的文件叫"c:\sign.txt".只要创建即可,不用写任何东西.
进程二,一直尝试打开"c:\sign.txt"由于文件不存在,则必定打开失败.直到进程一完成工作,创建了 c:\sign.txt
.进程二才能打开成功,则意味着进程二可以发送文件了.
我的例子是用C++ 标准流fstream写的.你也可以用c的
File 一样来完成
方法1代码:
进程1
#incle <windows.h>
int main()
{
HANDLE m_Mutex=CreateMutex(NULL, FALSE, "is_ok");
//写文件..... 你的代码
CloseHandle(m_Mutex);//删除Mutex is_ok;
return 0;
}
进程2
#incle<windows.h>
int main()
{
do {
HANDLE m_Mutex=CreateMutex(NULL, FALSE, "is_ok");
Sleep (5000); //每5秒检测一次
}while(GetLastError() == ERROR_ALREADY_EXISTS);
CloseHandle(m_Mutex);
//如果程序能执行到这里,代表进程一已经写完文件了
//进程二,你的代码写在这里.
return 0;
}
热心网友
时间:2024-11-05 19:07
写文件结束符由文件关闭函数建立。
例如 fclose(fout).
不必另写。
读文件结束符可以用
int feof ( FILE * stream );
标准函数判断。
两进程问题,如果写进程未关闭文件,写文件部分必须用
int fflush ( FILE * stream );
这种函数释放缓冲区,保证数据真正写出去了,并发送消息到读进程,让读进程读。不通过EOF检测。
热心网友
时间:2024-11-05 19:07
判断文件是否写结束
只要判断它是否被打开就可以了
判断文件是否被打开的函数:
bool IsFileInUse(String FileName)
{
bool Result;
HANDLE Handle = CreateFile(FileName.c_str(), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Result = INVALID_HANDLE_VALUE == Handle;
if (!Result)
CloseHandle(Handle);
return Result;
}
热心网友
时间:2024-11-05 19:08
写文件的进程在打开文件输出的时候使用WINDOWS的API接口:CreateFile,其第三个参数dwShareMode设置为NULL,就是不允许共享访问.然后第二个进程在准备发送文件时首先以读文件的方式调用CreateFile接口也以独占方式打开文件.此时如果第二个进程打开文件失败,CreateFile失败后用GetLastError得到的错误为32号则表示第一个进程还在写文件(文件没写完).以下是简单的检查代码,你可以借鉴:
void CFile1Dlg::OnOK()
{
HANDLE hFile=INVALID_HANDLE_VALUE;
HANDLE hFile2=INVALID_HANDLE_VALUE;
DWORD dwErrorNum;//保存错误代码
char * lpMsgBuf=NULL;//保存错误信息
hFile=CreateFile( "c:\\aa.txt",//文件名称
GENERIC_WRITE|GENERIC_READ,//读写权限
NULL,//不允许共享使用该文件
NULL,//不设置文件的安全属性
CREATE_ALWAYS,//创建方式(总是创建,覆盖旧文件)
FILE_ATTRIBUTE_NORMAL,//普通的文件属性
NULL//临时文件句柄
);
if (INVALID_HANDLE_VALUE==hFile)//创建失败
{
dwErrorNum=GetLastError();
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwErrorNum,
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
0,
NULL
);
::MessageBox(NULL,lpMsgBuf,"打开文件错误!",MB_OK);
LocalFree(lpMsgBuf);//释放生成的错误信息
}
hFile2=CreateFile( "c:\\aa.txt",//文件名称
GENERIC_READ,//读写权限
NULL,//不允许共享使用该文件
NULL,//不设置文件的安全属性
OPEN_EXISTING,//创建方式(总是打开)
FILE_ATTRIBUTE_NORMAL,//普通的文件属性
NULL//临时文件句柄
);
if (INVALID_HANDLE_VALUE==hFile2)//创建失败
{
dwErrorNum=GetLastError();
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwErrorNum,
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
0,
NULL
);
::MessageBox(NULL,lpMsgBuf,"打开文件错误!",MB_OK);
LocalFree(lpMsgBuf);//释放生成的错误信息
CloseHandle(hFile);
return;
}
CloseHandle(hFile);
CloseHandle(hFile2);
}
热心网友
时间:2024-11-05 19:08
搞那么多干嘛,C语言中提供库函数来判断一个文件是否结束!去查查书!
热心网友
时间:2024-11-05 19:09
某个文件“可能还没有完全落地”就被发送走?
“没有完全落地”意味着写操作没有完成,当文件采用互斥访问时上述情况是不可能发生的!