Windows:尝试以独占模式打开文件。如果有效,则没有其他人打开该文件,将无法打开该文件
HANDLE fh;
fh = CreateFile(filename, GENERIC_READ, 0 /* no sharing! exclusive */, NULL, OPEN_EXISTING, 0, NULL);
if ((fh != NULL) && (fh != INVALID_HANDLE_VALUE))
{
// the only open file to filename should be fh.
// do something
CloseHandle(fh);
}
MS 说:dwShareMode
对象的共享方式,可以是read、write、both、delete、all这些,也可以none(参考下表)。
如果该参数为零且CreateFile成功,则该对象不能被共享,并且在句柄关闭之前不能再次打开。
您不能请求与具有打开句柄的打开请求中指定的访问模式冲突的共享模式,因为这会导致以下共享冲突:ERROR_SHARING_VIOLATION。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx
扩展名:
如何删除没有人打开读/写的(非只读)文件系统?
访问权限 FILE_READ_ATTRIBUTES,而不是 DELETE。 DELETE 可能会导致 smb 共享(到 MS Windows 服务器)出现问题 - CreateFile 将留下一个仍然打开的 FileHandle /Device/Mup:xxx 文件名 - 为什么以及这个 Mup 是什么。访问权限 FILE_READ_ATTRIBUTES 不会发生
使用 FILE_FLAG_OPEN_REPARSE_POINT 删除文件名。否则,您将删除符号链接的目标 - 这通常不是您想要的
HANDLE fh;
fh = CreateFile(filename, FILE_READ_ATTRIBUTES, FILE_SHARE_DELETE /* no RW sharing! */, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_DELETE_ON_CLOSE, NULL);
if ((fh != NULL) && (fh != INVALID_HANDLE_VALUE))
{
DeleteFile(filename); /* looks stupid?
* but FILE_FLAG_DELETE_ON_CLOSE will not work on some smb shares (e.g. samba)!
* FILE_SHARE_DELETE should allow this DeleteFile() and so the problem could be solved by additional DeleteFile()
*/
CloseHandle(fh); /* a file, which no one has currently opened for RW is delete NOW */
}
如何处理打开的文件?如果文件已打开并且您被允许取消链接,您将留下一个文件,后续打开将导致 ACCESS_DENIED。
如果您有一个临时文件夹,那么最好重命名(filename, tempdir/filename.delete) 并删除 tempdir/filename.delete。