疑惑CreateFile参数设置为FILE_SHARE_READ,其他程序还是不能读?

BAO BAO 2015-10-03 11:19:58
#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);

getchar(); //此时,手动记事本打开temp.txt 不能打开说是占用(明明使用了FILE_SHARE_READ)
CloseHandle(hFile);
return 0;
}
...全文
1217 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnnnb 2017-04-27
  • 打赏
  • 举报
回复
记事本再打开文件时会试图请求所有权限,如果不能读取就会提示被占用。如果能读不能写则修改才会提示被占用。如果有别的程序占用了一部分权限,那么记事本将会请求剩下的所有权限。但是别忘了,记事本打开文件时请求了所有权限但仅仅使用了读取权限一项,而如果请求到了写入权也仅会在修改时使用,也就是说请求到的权限不会都使用。所以你要实现这个读写就要再单独写一个以只读打开文件的程序来读文件。 但是记住,如果记事本不能读取文件,哪怕写入权限开放也不能写入,但是自己的程序是可以的。 希望我能帮到你。
earllhc 2015-10-19
  • 打赏
  • 举报
回复
你好,请问你的这个问题解决了吗?
BAO BAO 2015-10-08
  • 打赏
  • 举报
回复
引用 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。我又不着急是否在关闭句柄前删除。
bluewanderer 2015-10-08
  • 打赏
  • 举报
回复
引用 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吧。
bluewanderer 2015-10-08
  • 打赏
  • 举报
回复
引用 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
赵4老师 2015-10-08
  • 打赏
  • 举报
回复
《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》
赵4老师 2015-10-08
  • 打赏
  • 举报
回复
_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
bluewanderer 2015-10-08
  • 打赏
  • 举报
回复
引用 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。
BAO BAO 2015-10-07
  • 打赏
  • 举报
回复
引用 7 楼 bluewanderer 的回复:
准确地说是你这操作一边写还一边开share_read属于作死,还是有其他情况需要一边写另一边读的...
您不会看代码吗? 操作一边写还一边开share_read 不行吗?怎么就作死了? 别说是我写数据到文件是在完成后 ,才用第三方程序调用的,就算我多线程 一边写入数据,令一线程同时来读取内容 又怎么了? msdn上哪说GENERIC_WRITE创建文件时,不能用FILE_SHARE_READ老共享,难道一直用0 来独占吗?
BAO BAO 2015-10-07
  • 打赏
  • 举报
回复
引用 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来写文件 到你这里就作死了。我这样写也没提示错误 啊
bluewanderer 2015-10-05
  • 打赏
  • 举报
回复
准确地说是你这操作一边写还一边开share_read属于作死,还是有其他情况需要一边写另一边读的...
bluewanderer 2015-10-05
  • 打赏
  • 举报
回复
首先,题外话写文件开share_read本来就是作死。 然后,Notepad根本不支持只读打开。 最后,搞清楚share_read是允许别的程序用读模式打开文件,这个时候如果别的程序请求读以外的权限就会失败,而不是只要请求了读权限就能成功。
赵4老师 2015-10-05
  • 打赏
  • 举报
回复
To get extended error information, call GetLastError.
BAO BAO 2015-10-03
  • 打赏
  • 举报
回复
引用 2 楼 ant2012 的回复:
在第二参数中,加上 | GENERIC_READ试试
试过了 加上 | GENERIC_READ 在1代码中: 依然不能 打开读取temp.txt文件,难道使用FILE_FLAG_DELETE_ON_CLOSE,就只能是独占模式?不管你设置的是否独占模式 在2代码中:依然不能写如gp.txt文件
二班的码农 2015-10-03
  • 打赏
  • 举报
回复
在第二参数中,加上 | GENERIC_READ试试
BAO BAO 2015-10-03
  • 打赏
  • 举报
回复

#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);
}
纵横车 2015-10-03
  • 打赏
  • 举报
回复
不知道是不是记事本打开文件是不共享的。在代码里再加一个CreateFile和WriteFile,两个CreateFile以共享模式打开同一个文件并写入发现没什么问题。但是如果一个CreateFile是以非共享方式打开文件,那它写入的时候就会error,觉得这就和记事本一样。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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