如何获取文件得状态? 当一个文件正在被修改得时候,是应该不能对它进行拷贝,删除等操作得,我得问题是如何得知这个文件它正在被修改? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用下面这个函数来监控指定的文件变化(包括写、改名)HANDLE FindFirstChangeNotification( LPCTSTR lpPathName, // directory name BOOL bWatchSubtree, // monitoring option DWORD dwNotifyFilter // filter conditions);例如:HANDLE hh = FindFirstChangeNotification("youfilename",true,FILE_NOTIFY_CHANGE_LAST_WRITE);WaitForSingleObject(h,INFINITE);当监控的文件发生状态发生变化时,WaitForSingleObject函数就会返回,否则一直等待! 如果别的进程正在写文件,你fopen应该会出错吧。如果fopen成功了再考,如果不成功就不考。 FILE *stream; if( (stream = fopen( "F:\\test\\a.txt", "r" )) == NULL ) MessageBox( "The file 'a.txt' was not opened" ); else MessageBox( "The file 'a.txt' was opened" );不行啊,我打开了a.txt然后运行程序,还是可以成功打开啊。 是这样的:我要把一个目录的一些文件进行转移,在转移某个文件的时候,如果它正在被其他程序更改,我是不能转移的。我觉得Windows应该对一个正在修改的文件进行标记,这样当有人想对这个文件进行转移等操作的时候被禁止。 你用写文件方式打开文件试试,windows应该不会允许两个程序同时写一个文件吧。 使用CreateFile试验成功,如果有其他的程序打开了a.txt,此程序将返回失败。#include "windows.h"#include "stdio.h"void main(){ HANDLE handle = CreateFile( "c:\\a.txt", // file name GENERIC_WRITE, // access mode 0, // share mode ,这个参数控制是否共享 NULL, // SD OPEN_EXISTING, // how to create FILE_ATTRIBUTE_NORMAL, // file attributes NULL // handle to template file ); if (handle == INVALID_HANDLE_VALUE) printf("fail"); else{ printf("success"); CloseHandle(handle); }} 不知道你们怎么测试成功的。我是这样的:打开一个txt文件,然后运行程序,结果提示打开成功。但是如果打开一个doc文件,然后运行程序,结果就是失败。原来这跟文件类型有关。你可以试试:打开一个txt文件,然后试图删除这个文件(在windows里)结果是成功;如果换作是doc文件就会报错了。不过还是要谢谢诸位! 不知道你是怎么测试的,下面是我的两个测试例子:test1:(模拟其他程序打开某个文件正在读写)#include "stdio.h"#include "stdlib.h"#include "windows.h"void main(){ FILE *fp; fp = fopen("c:\\a.txt","r"); if(fp){ printf("Success"); } else printf("fail"); Sleep(100000); if(fp) fclose(fp);}test2:(模拟你自己的程序)#include "windows.h"#include "stdio.h"void main(){ HANDLE handle = CreateFile( "c:\\a.txt", // file name GENERIC_WRITE, // access mode 0, // share mode NULL, // SD OPEN_EXISTING, // how to create FILE_ATTRIBUTE_NORMAL, // file attributes NULL // handle to template file ); if (handle == INVALID_HANDLE_VALUE) printf("fail"); else{ printf("success"); // 做你自己的操作,比如移动或者删除文件。 CloseHandle(handle); }}如果第一个程序已经运行,再运行第二个应该显示fail,否则应该显示success我的测试平台:win2000 sp4 vc6 我测试的时候是把txt文件打开,不是用程序打开,而是在windows里打开这个文件。然后运行程序。 测试:使用记事本,写字板等程序打开a.txt时,test2返回success;而使用word打开a.txt时,test2返回fail。问题原因(猜想):是否由于各个程序打开文件的方式不一样?记事本打开一个文本文件读入文件内容到缓冲,然后关闭了文件句柄,所以test2可以打开文件。而word打开文件后没有关闭句柄,所以test2返回fail。解决办法:我试验了一下,在用记事本打开某个文件的时候,你可以任意拷贝,覆盖,甚至删除这个文件。既然windows都没有考虑这种情况,我认为你也完全不用考虑这种情况。该怎么办还怎么办。 在类中使用静态成员变量句柄出现问题 模块化编程,自定义组合(MFC) 请问杀毒软件等软件向其它进程注入DLL的方法是什么? 请问一个多线程引起的重定义问题,各位大哥帮下忙!分不多了!不好意思! 关于对话框的继承后的显示问题.... 如何直接修改clistctrl中显示的数据? 如何用vc++为对话框设置一个热键? 如何解决dllhost 出错 关于在CDialog类的派生类中内存管理的问题,为什么我delete总是出debug错误? ado编程中空数据表AddNew失败的问题 如何在一个对话框中得到另一个对话框中某个控件的属性 关于网络SOCKET连接的IP问题。
LPCTSTR lpPathName, // directory name
BOOL bWatchSubtree, // monitoring option
DWORD dwNotifyFilter // filter conditions
);例如:HANDLE h
h = FindFirstChangeNotification("youfilename",true,FILE_NOTIFY_CHANGE_LAST_WRITE);
WaitForSingleObject(h,INFINITE);
当监控的文件发生状态发生变化时,WaitForSingleObject函数就会返回,否则一直等待!
如果fopen成功了再考,如果不成功就不考。
if( (stream = fopen( "F:\\test\\a.txt", "r" )) == NULL )
MessageBox( "The file 'a.txt' was not opened" );
else
MessageBox( "The file 'a.txt' was opened" );
不行啊,我打开了a.txt然后运行程序,还是可以成功打开啊。
#include "windows.h"
#include "stdio.h"
void main(){
HANDLE handle = CreateFile(
"c:\\a.txt", // file name
GENERIC_WRITE, // access mode
0, // share mode ,这个参数控制是否共享
NULL, // SD
OPEN_EXISTING, // how to create
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL // handle to template file
); if (handle == INVALID_HANDLE_VALUE)
printf("fail");
else{
printf("success");
CloseHandle(handle);
}}
原来这跟文件类型有关。你可以试试:打开一个txt文件,然后试图删除这个文件(在windows里)结果是成功;如果换作是doc文件就会报错了。
不过还是要谢谢诸位!
test1:(模拟其他程序打开某个文件正在读写)
#include "stdio.h"
#include "stdlib.h"
#include "windows.h"
void main(){
FILE *fp;
fp = fopen("c:\\a.txt","r");
if(fp){
printf("Success");
}
else
printf("fail"); Sleep(100000);
if(fp)
fclose(fp);
}test2:(模拟你自己的程序)
#include "windows.h"
#include "stdio.h"
void main(){
HANDLE handle = CreateFile(
"c:\\a.txt", // file name
GENERIC_WRITE, // access mode
0, // share mode
NULL, // SD
OPEN_EXISTING, // how to create
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL // handle to template file
); if (handle == INVALID_HANDLE_VALUE)
printf("fail");
else{
printf("success");
// 做你自己的操作,比如移动或者删除文件。
CloseHandle(handle);
}}
如果第一个程序已经运行,再运行第二个应该显示fail,否则应该显示success
我的测试平台:win2000 sp4 vc6
问题原因(猜想):是否由于各个程序打开文件的方式不一样?记事本打开一个文本文件读入文件内容到缓冲,然后关闭了文件句柄,所以test2可以打开文件。而word打开文件后没有关闭句柄,所以test2返回fail。解决办法:
我试验了一下,在用记事本打开某个文件的时候,你可以任意拷贝,覆盖,甚至删除这个文件。既然windows都没有考虑这种情况,我认为你也完全不用考虑这种情况。该怎么办还怎么办。