当一个文件正在被修改得时候,是应该不能对它进行拷贝,删除等操作得,我得问题是如何得知这个文件它正在被修改?

解决方案 »

  1.   

    用下面这个函数来监控指定的文件变化(包括写、改名)HANDLE FindFirstChangeNotification(
      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函数就会返回,否则一直等待!
      

  2.   

    如果别的进程正在写文件,你fopen应该会出错吧。
    如果fopen成功了再考,如果不成功就不考。
      

  3.   

    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然后运行程序,还是可以成功打开啊。
      

  4.   

    是这样的:我要把一个目录的一些文件进行转移,在转移某个文件的时候,如果它正在被其他程序更改,我是不能转移的。我觉得Windows应该对一个正在修改的文件进行标记,这样当有人想对这个文件进行转移等操作的时候被禁止。
      

  5.   

    你用写文件方式打开文件试试,windows应该不会允许两个程序同时写一个文件吧。
      

  6.   

    使用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);
      }}
      

  7.   

    不知道你们怎么测试成功的。我是这样的:打开一个txt文件,然后运行程序,结果提示打开成功。但是如果打开一个doc文件,然后运行程序,结果就是失败。
    原来这跟文件类型有关。你可以试试:打开一个txt文件,然后试图删除这个文件(在windows里)结果是成功;如果换作是doc文件就会报错了。
    不过还是要谢谢诸位!
      

  8.   

    不知道你是怎么测试的,下面是我的两个测试例子:
    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
      

  9.   

    我测试的时候是把txt文件打开,不是用程序打开,而是在windows里打开这个文件。然后运行程序。
      

  10.   

    测试:使用记事本,写字板等程序打开a.txt时,test2返回success;而使用word打开a.txt时,test2返回fail。
    问题原因(猜想):是否由于各个程序打开文件的方式不一样?记事本打开一个文本文件读入文件内容到缓冲,然后关闭了文件句柄,所以test2可以打开文件。而word打开文件后没有关闭句柄,所以test2返回fail。解决办法:
    我试验了一下,在用记事本打开某个文件的时候,你可以任意拷贝,覆盖,甚至删除这个文件。既然windows都没有考虑这种情况,我认为你也完全不用考虑这种情况。该怎么办还怎么办。