user-0 提问: 疑惑CreateFile参数设置为FILE_SHARE_READ，其他程序还是不能读？

回复:
user: user-1
content: 记事本再打开文件时会试图请求所有权限，如果不能读取就会提示被占用。如果能读不能写则修改才会提示被占用。如果有别的程序占用了一部分权限，那么记事本将会请求剩下的所有权限。但是别忘了，记事本打开文件时请求了所有权限但仅仅使用了读取权限一项，而如果请求到了写入权也仅会在修改时使用，也就是说请求到的权限不会都使用。所以你要实现这个读写就要再单独写一个以只读打开文件的程序来读文件。 但是记住，如果记事本不能读取文件，哪怕写入权限开放也不能写入，但是自己的程序是可以的。 希望我能帮到你。

user: user-2
content: 你好，请问你的这个问题解决了吗？

user: user-0
content: 引用 13 楼 bluewanderer 的回复:[quote=引用 8 楼 wqte45 的回复:] [quote=引用 6 楼 bluewanderer 的回复:] 首先，题外话写文件开share_read本来就是作死。 然后，Notepad根本不支持只读打开。 最后，搞清楚share_read是允许别的程序用读模式打开文件，这个时候如果别的程序请求读以外的权限就会失败，而不是只要请求了读权限就能成功。  首先，您在回帖之前一定没做测试吧，另外我不得不说  你没看明白我问的问题，其次记事本是可以打开已创建share_read属性文本文件的，CreateFile("gp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  比如这句 是用FILE_ATTRIBUTE_NORMAL正常属性创建的文件，即使后面还有代码运行 以及文件句柄还没关闭，此时就可以 用记事本打开刚创建的gp.txt。我的问题是 为什么 我用FILE_FLAG_DELETE_ON_CLOSE属性创建文件，FILE_SHARE_READ标记就不起作用了。。。。。FILE_FLAG_DELETE_ON_CLOSE属性的意思是 创建一个文件 关闭句柄时会被自动删除，  #include <windows.h> #include <stdio.h> int main() { 	DWORD dwBytes; 	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);     WinExec("notepad temp.txt",SW_SHOW);  //此时就能打开，楼上的说GENERIC_WRITE写文件同时FILE_SHARE_READ共享，不能用。扯淡 	getchar();  	CloseHandle(hFile);          	return 0; }  下面我用FILE_FLAG_DELETE_ON_CLOSE属性替换FILE_ATTRIBUTE_NORMAL属性  #include <windows.h> #include <stdio.h> int main() { 	DWORD dwBytes; 	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL); 	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);     WinExec("notepad temp.txt",SW_SHOW);  //此时就不能打开 提示被占用  同样都是,FILE_SHARE_READ,。 	getchar();  	CloseHandle(hFile);         	return 0; }  所以我质疑使用 FILE_FLAG_DELETE_ON_CLOSE 属性 ，FILE_SHARE_READ会不起作用，但我不确定，就上来请教大家。FILE_FLAG_DELETE_ON_CLOSE属性不懂自己查，当用此属性创建文件时候，关闭句柄后 会自动删除所创建的文件，做临时文件最适合。但我需要在被创建后  被第三方程序调用读取加载，正常属性都可以，除了这个 FILE_FLAG_DELETE_ON_CLOSE，所有就出现了此贴。 如果真不行  我只能用普通属性创建 ，最后用deletefile来删除了。  以上就是我的第一个问题。我就不明白了  我用CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  怎么就作死了  我按照msdn来写文件  到你这里就作死了。我这样写也没提示错误 啊[/quote]  没仔细看，发现Notepad进化了=-=... 不过既然你看文档了就应该知道还有个share_delete吧。[/quote]  share_delete  对我没什么用。我就想用FILE_FLAG_DELETE_ON_CLOSE，既然用此属性的时候  不能共享给其他程序读，那我就在关闭句柄后  DeleteFile就好了，用不着share_delete。我又不着急是否在关闭句柄前删除。

user: user-3
content: 引用 8 楼 wqte45 的回复:[quote=引用 6 楼 bluewanderer 的回复:] 首先，题外话写文件开share_read本来就是作死。 然后，Notepad根本不支持只读打开。 最后，搞清楚share_read是允许别的程序用读模式打开文件，这个时候如果别的程序请求读以外的权限就会失败，而不是只要请求了读权限就能成功。  首先，您在回帖之前一定没做测试吧，另外我不得不说  你没看明白我问的问题，其次记事本是可以打开已创建share_read属性文本文件的，CreateFile("gp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  比如这句 是用FILE_ATTRIBUTE_NORMAL正常属性创建的文件，即使后面还有代码运行 以及文件句柄还没关闭，此时就可以 用记事本打开刚创建的gp.txt。我的问题是 为什么 我用FILE_FLAG_DELETE_ON_CLOSE属性创建文件，FILE_SHARE_READ标记就不起作用了。。。。。FILE_FLAG_DELETE_ON_CLOSE属性的意思是 创建一个文件 关闭句柄时会被自动删除，  #include <windows.h> #include <stdio.h> int main() { 	DWORD dwBytes; 	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);     WinExec("notepad temp.txt",SW_SHOW);  //此时就能打开，楼上的说GENERIC_WRITE写文件同时FILE_SHARE_READ共享，不能用。扯淡 	getchar();  	CloseHandle(hFile);          	return 0; }  下面我用FILE_FLAG_DELETE_ON_CLOSE属性替换FILE_ATTRIBUTE_NORMAL属性  #include <windows.h> #include <stdio.h> int main() { 	DWORD dwBytes; 	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL); 	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);     WinExec("notepad temp.txt",SW_SHOW);  //此时就不能打开 提示被占用  同样都是,FILE_SHARE_READ,。 	getchar();  	CloseHandle(hFile);         	return 0; }  所以我质疑使用 FILE_FLAG_DELETE_ON_CLOSE 属性 ，FILE_SHARE_READ会不起作用，但我不确定，就上来请教大家。FILE_FLAG_DELETE_ON_CLOSE属性不懂自己查，当用此属性创建文件时候，关闭句柄后 会自动删除所创建的文件，做临时文件最适合。但我需要在被创建后  被第三方程序调用读取加载，正常属性都可以，除了这个 FILE_FLAG_DELETE_ON_CLOSE，所有就出现了此贴。 如果真不行  我只能用普通属性创建 ，最后用deletefile来删除了。  以上就是我的第一个问题。我就不明白了  我用CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  怎么就作死了  我按照msdn来写文件  到你这里就作死了。我这样写也没提示错误 啊[/quote]  没仔细看，发现Notepad进化了=-=... 不过既然你看文档了就应该知道还有个share_delete吧。

user: user-3
content: 引用 9 楼 wqte45 的回复:[quote=引用 7 楼 bluewanderer 的回复:] 准确地说是你这操作一边写还一边开share_read属于作死，还是有其他情况需要一边写另一边读的...  您不会看代码吗？   操作一边写还一边开share_read  不行吗？怎么就作死了？     别说是我写数据到文件是在完成后 ，才用第三方程序调用的，就算我多线程 一边写入数据，令一线程同时来读取内容 又怎么了？ msdn上哪说GENERIC_WRITE创建文件时，不能用FILE_SHARE_READ老共享，难道一直用0 来独占吗？[/quote]  引用 9 楼 wqte45 的回复:[quote=引用 7 楼 bluewanderer 的回复:] 准确地说是你这操作一边写还一边开share_read属于作死，还是有其他情况需要一边写另一边读的...  您不会看代码吗？   操作一边写还一边开share_read  不行吗？怎么就作死了？     别说是我写数据到文件是在完成后 ，才用第三方程序调用的，就算我多线程 一边写入数据，令一线程同时来读取内容 又怎么了？ msdn上哪说GENERIC_WRITE创建文件时，不能用FILE_SHARE_READ老共享，难道一直用0 来独占吗？[/quote]  正因为行所以在会死，拿墙围起来的悬崖你还能跳么-v-bb

user: user-4
content: 《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》

user: user-4
content: _locking Locks or unlocks bytes of a file.  int _locking( int handle, int mode, long nbytes );  Routine Required Header Optional Headers Compatibility  _locking <io.h> and <sys/locking.h> <errno.h> Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  _locking returns 0 if successful. A return value of –1 indicates failure, in which case errno is set to one of the following values:  EACCES  Locking violation (file already locked or unlocked).  EBADF  Invalid file handle.  EDEADLOCK  Locking violation. Returned when the _LK_LOCK or _LK_RLCK flag is specified and the file cannot be locked after 10 attempts.  EINVAL  An invalid argument was given to _locking.  Parameters  handle  File handle  mode  Locking action to perform  nbytes  Number of bytes to lock  Remarks  The _locking function locks or unlocks nbytes bytes of the file specified by handle. Locking bytes in a file prevents access to those bytes by other processes. All locking or unlocking begins at the current position of the file pointer and proceeds for the next nbytes bytes. It is possible to lock bytes past end of file.  mode must be one of the following manifest constants, which are defined in LOCKING.H:  _LK_LOCK  Locks the specified bytes. If the bytes cannot be locked, the program immediately tries again after 1 second. If, after 10 attempts, the bytes cannot be locked, the constant returns an error.  _LK_NBLCK  Locks the specified bytes. If the bytes cannot be locked, the constant returns an error.  _LK_NBRLCK  Same as _LK_NBLCK.  _LK_RLCK  Same as _LK_LOCK.  _LK_UNLCK  Unlocks the specified bytes, which must have been previously locked.  Multiple regions of a file that do not overlap can be locked. A region being unlocked must have been previously locked. _locking does not merge adjacent regions; if two locked regions are adjacent, each region must be unlocked separately. Regions should be locked only briefly and should be unlocked before closing a file or exiting the program.  Example  /* LOCKING.C: This program opens a file with sharing. It locks  * some bytes before reading them, then unlocks them. Note that the  * program works correctly only if the file exists.  */  #include <io.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/locking.h> #include <share.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h>  void main( void ) {    int  fh, numread;    char buffer[40];     /* Quit if can't open file or system doesn't      * support sharing.      */    fh = _sopen( "locking.c", _O_RDWR, _SH_DENYNO,                   _S_IREAD | _S_IWRITE );    if( fh == -1 )       exit( 1 );     /* Lock some bytes and read them. Then unlock. */    if( _locking( fh, LK_NBLCK, 30L ) != -1 )    {       printf( "No one can change these bytes while I'm reading them\n" );       numread = _read( fh, buffer, 30 );       printf( "%d bytes read: %.30s\n", numread, buffer );       lseek( fh, 0L, SEEK_SET );      _locking( fh, LK_UNLCK, 30L );       printf( "Now I'm done. Do what you will with them\n" );    }    else       perror( "Locking failed\n" );     _close( fh ); }   Output  No one can change these bytes while I'm reading them 30 bytes read: /* LOCKING.C: This program ope Now I'm done. Do what you will with them   File Handling Routines  See Also   _creat, _open

user: user-3
content: 引用 14 楼 wqte45 的回复:[quote=引用 13 楼 bluewanderer 的回复:] [quote=引用 8 楼 wqte45 的回复:] [quote=引用 6 楼 bluewanderer 的回复:] 首先，题外话写文件开share_read本来就是作死。 然后，Notepad根本不支持只读打开。 最后，搞清楚share_read是允许别的程序用读模式打开文件，这个时候如果别的程序请求读以外的权限就会失败，而不是只要请求了读权限就能成功。  首先，您在回帖之前一定没做测试吧，另外我不得不说  你没看明白我问的问题，其次记事本是可以打开已创建share_read属性文本文件的，CreateFile("gp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  比如这句 是用FILE_ATTRIBUTE_NORMAL正常属性创建的文件，即使后面还有代码运行 以及文件句柄还没关闭，此时就可以 用记事本打开刚创建的gp.txt。我的问题是 为什么 我用FILE_FLAG_DELETE_ON_CLOSE属性创建文件，FILE_SHARE_READ标记就不起作用了。。。。。FILE_FLAG_DELETE_ON_CLOSE属性的意思是 创建一个文件 关闭句柄时会被自动删除，  #include <windows.h> #include <stdio.h> int main() { 	DWORD dwBytes; 	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);     WinExec("notepad temp.txt",SW_SHOW);  //此时就能打开，楼上的说GENERIC_WRITE写文件同时FILE_SHARE_READ共享，不能用。扯淡 	getchar();  	CloseHandle(hFile);          	return 0; }  下面我用FILE_FLAG_DELETE_ON_CLOSE属性替换FILE_ATTRIBUTE_NORMAL属性  #include <windows.h> #include <stdio.h> int main() { 	DWORD dwBytes; 	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL); 	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);     WinExec("notepad temp.txt",SW_SHOW);  //此时就不能打开 提示被占用  同样都是,FILE_SHARE_READ,。 	getchar();  	CloseHandle(hFile);         	return 0; }  所以我质疑使用 FILE_FLAG_DELETE_ON_CLOSE 属性 ，FILE_SHARE_READ会不起作用，但我不确定，就上来请教大家。FILE_FLAG_DELETE_ON_CLOSE属性不懂自己查，当用此属性创建文件时候，关闭句柄后 会自动删除所创建的文件，做临时文件最适合。但我需要在被创建后  被第三方程序调用读取加载，正常属性都可以，除了这个 FILE_FLAG_DELETE_ON_CLOSE，所有就出现了此贴。 如果真不行  我只能用普通属性创建 ，最后用deletefile来删除了。  以上就是我的第一个问题。我就不明白了  我用CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  怎么就作死了  我按照msdn来写文件  到你这里就作死了。我这样写也没提示错误 啊[/quote]  没仔细看，发现Notepad进化了=-=... 不过既然你看文档了就应该知道还有个share_delete吧。[/quote]  share_delete  对我没什么用。我就想用FILE_FLAG_DELETE_ON_CLOSE，既然用此属性的时候  不能共享给其他程序读，那我就在关闭句柄后  DeleteFile就好了，用不着share_delete。我又不着急是否在关闭句柄前删除。[/quote]  我不是说你要用share_delete，是说notepad没用share_delete。

user: user-0
content: 引用 7 楼 bluewanderer 的回复:准确地说是你这操作一边写还一边开share_read属于作死，还是有其他情况需要一边写另一边读的...  您不会看代码吗？   操作一边写还一边开share_read  不行吗？怎么就作死了？     别说是我写数据到文件是在完成后 ，才用第三方程序调用的，就算我多线程 一边写入数据，令一线程同时来读取内容 又怎么了？ msdn上哪说GENERIC_WRITE创建文件时，不能用FILE_SHARE_READ老共享，难道一直用0 来独占吗？

user: user-0
content: 引用 6 楼 bluewanderer 的回复:首先，题外话写文件开share_read本来就是作死。 然后，Notepad根本不支持只读打开。 最后，搞清楚share_read是允许别的程序用读模式打开文件，这个时候如果别的程序请求读以外的权限就会失败，而不是只要请求了读权限就能成功。  首先，您在回帖之前一定没做测试吧，另外我不得不说  你没看明白我问的问题，其次记事本是可以打开已创建share_read属性文本文件的，CreateFile("gp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  比如这句 是用FILE_ATTRIBUTE_NORMAL正常属性创建的文件，即使后面还有代码运行 以及文件句柄还没关闭，此时就可以 用记事本打开刚创建的gp.txt。我的问题是 为什么 我用FILE_FLAG_DELETE_ON_CLOSE属性创建文件，FILE_SHARE_READ标记就不起作用了。。。。。FILE_FLAG_DELETE_ON_CLOSE属性的意思是 创建一个文件 关闭句柄时会被自动删除，  #include <windows.h> #include <stdio.h> int main() { 	DWORD dwBytes; 	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);     WinExec("notepad temp.txt",SW_SHOW);  //此时就能打开，楼上的说GENERIC_WRITE写文件同时FILE_SHARE_READ共享，不能用。扯淡 	getchar();  	CloseHandle(hFile);          	return 0; }  下面我用FILE_FLAG_DELETE_ON_CLOSE属性替换FILE_ATTRIBUTE_NORMAL属性  #include <windows.h> #include <stdio.h> int main() { 	DWORD dwBytes; 	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL); 	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);     WinExec("notepad temp.txt",SW_SHOW);  //此时就不能打开 提示被占用  同样都是,FILE_SHARE_READ,。 	getchar();  	CloseHandle(hFile);         	return 0; }  所以我质疑使用 FILE_FLAG_DELETE_ON_CLOSE 属性 ，FILE_SHARE_READ会不起作用，但我不确定，就上来请教大家。FILE_FLAG_DELETE_ON_CLOSE属性不懂自己查，当用此属性创建文件时候，关闭句柄后 会自动删除所创建的文件，做临时文件最适合。但我需要在被创建后  被第三方程序调用读取加载，正常属性都可以，除了这个 FILE_FLAG_DELETE_ON_CLOSE，所有就出现了此贴。 如果真不行  我只能用普通属性创建 ，最后用deletefile来删除了。  以上就是我的第一个问题。我就不明白了  我用CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  怎么就作死了  我按照msdn来写文件  到你这里就作死了。我这样写也没提示错误 啊

user: user-3
content: 准确地说是你这操作一边写还一边开share_read属于作死，还是有其他情况需要一边写另一边读的...

user: user-3
content: 首先，题外话写文件开share_read本来就是作死。 然后，Notepad根本不支持只读打开。 最后，搞清楚share_read是允许别的程序用读模式打开文件，这个时候如果别的程序请求读以外的权限就会失败，而不是只要请求了读权限就能成功。

user: user-4
content: To get extended error information, call GetLastError.

user: user-0
content: 引用 2 楼 ant2012 的回复:在第二参数中，加上  | GENERIC_READ试试  试过了 加上  | GENERIC_READ  在1代码中：  依然不能 打开读取temp.txt文件，难道使用FILE_FLAG_DELETE_ON_CLOSE，就只能是独占模式？不管你设置的是否独占模式  在2代码中：依然不能写如gp.txt文件

user: user-5
content: 在第二参数中，加上  | GENERIC_READ试试

user: user-0
content: #include <windows.h> #include <stdio.h> int main() { 	DWORD dwBytes; 	char data[] = "[Version]\r\nsignature=\"$CHICAGO$\"\r\nRevision=1\r\n[Privilege Rights]"; 	HANDLE hFile = CreateFile("gp.txt",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);	 	getchar();    //又发现问题，这次创建正常属性的文件，使用FILE_SHARE_READ|FILE_SHARE_WRITE， 	              //可记事本只能打开，如果修改了还是不能保存，说是占用,这跟单独用FILE_SHARE_READ没啥区别。 	              //dwShareMode  这个参数 到底怎么用的。	 	CloseHandle(hFile); }

user: user-6
content: 不知道是不是记事本打开文件是不共享的。在代码里再加一个CreateFile和WriteFile，两个CreateFile以共享模式打开同一个文件并写入发现没什么问题。但是如果一个CreateFile是以非共享方式打开文件，那它写入的时候就会error，觉得这就和记事本一样。