none
CreateFile在WIN7的问题 RRS feed

  • 问题

  • 开启WIN7的UAC控制,这个是前提,要不然下面是没问题的。用CreateFile打开一个c:\1.txt文件,文件里面内容是1,然后使用WriteFile写入111,然后关闭文件。第二次删除c:\1.txt,然后重启系统,开机后调用CreateFile打开文件c:\1.txt,竟然还是能打开,而且读取到的内容是111。所以111肯定被系统缓存了,我想知道这个文件的内容被缓存到哪里了?有没有什么方式不让系统在写入文件的时候缓存?
    2011年11月28日 8:33

全部回复

  • 有点可以肯定,我测试过了,就是由于调用WriteFile写入东西到文件才出现我上面说的问题,假如不调用WriteFile不会又问题的。

    2011年11月28日 8:59
  • 不可能,你在其他电脑上试试吧,没有重现
    0xBAADF00D
    2011年11月29日 3:03
    版主
  • 你好,

     

    根据您提供的情况,我使用CreateFileWriteFile试图重现您的问题。然而,在我本地并没有发生类似的情况。 这是我的部分代码:

    hFile = CreateFile("c:\\1.txt",         //   file   to   open  

        GENERIC_WRITE,                     //   open   for   reading  

        FILE_SHARE_WRITE,               //   share   for   reading  

        NULL,                                     //   default   security  

        OPEN_ALWAYS,                   //   existing   file   only  

        FILE_ATTRIBUTE_NORMAL,   //   normal   file  

        NULL);

                    DWORD dwSize = 0;

                    char* temp = "111";

                    if(!WriteFile(hFile,&temp,sizeof(temp),&dwSize,NULL  ))

                    {

                                    ;;

                    }

                    CloseHandle(hFile);

     

    您能够为我们提供更详细的重现步骤吗?例如您是通过函数删除还是手动删除1.txt?您能够提供一些您的代码?

     


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月29日 6:49
  •  HANDLE hFile = CreateFile(L"C:\\Program Files\\Jingoal\\1.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL/* | FILE_FLAG_NO_BUFFERING*/
      , NULL);
     if (hFile == INVALID_HANDLE_VALUE)
     {
      ASSERT(0);
     }
     //DWORD dw;
     //if (FlushFileBuffers(hFile) == 0)
     //{
     // ASSERT(0);
     // dw = GetLastError();
     //}
     char szBu4[25] = {0};
     DWORD szR = 0;
     ReadFile(hFile, szBu4, 512, &szR, NULL);
     DWORD dwW;
     if (WriteFile(hFile, szBu4, 3, &dwW, NULL) == 0)
     {
      dwW = GetLastError();
     } 
     CloseHandle(hFile);

     

    上面的代码就是我提得问题,这个问题肯定是可以重现的,我试了很多次。

    2011年11月29日 9:09
  • 文件1.txt首先是存在的,从我的CreateFile函数就可以看出来。然后执行我上面的代码,最后手动删除1.txt文件,再次执行代码,你就会看见奇迹发生了。呵呵。

    2011年11月29日 9:11
  • 不可能,你在其他电脑上试试吧,没有重现
    0xBAADF00D

    试试我下面的代码。
    2011年11月29日 9:14
  • 你好,

     

    根据您提供的情况,我使用CreateFileWriteFile试图重现您的问题。然而,在我本地并没有发生类似的情况。 这是我的部分代码:

    hFile = CreateFile("c:\\1.txt",         //   file   to   open  

        GENERIC_WRITE,                     //   open   for   reading  

        FILE_SHARE_WRITE,               //   share   for   reading  

        NULL,                                     //   default   security  

        OPEN_ALWAYS,                   //   existing   file   only  

        FILE_ATTRIBUTE_NORMAL,   //   normal   file  

        NULL);

                    DWORD dwSize = 0;

                    char* temp = "111";

                    if(!WriteFile(hFile,&temp,sizeof(temp),&dwSize,NULL  ))

                    {

                                    ;;

                    }

                    CloseHandle(hFile);

     

    您能够为我们提供更详细的重现步骤吗?例如您是通过函数删除还是手动删除1.txt?您能够提供一些您的代码?

     


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us

    试试我下面发的代码,问题就能重现了。
    2011年11月29日 9:15