在LINUX下可以使用sync命令强制将磁盘缓冲的所有数据写入磁盘,在Windows下怎么做?有没有什么函数接口?

解决方案 »

  1.   

    对磁盘扇区数据的访问  前面已经提过,在Windows 下把所有的设备当作文件进行操作。如果对串口进行编程或许不少读者还比较熟悉:对于串行端口1、2,可以用”COM1”、”COM2”作为参数调用CreateFile()函数,这里的”COM1”、”COM2”即以文件存放路径的方式指出了要操作的硬件设备。但是如果需要对磁盘的某个扇区进行读写,可能不少读者不会想到使用CreateFile()函数或是不知如何使用。其实,与对串行端口的访问类似,需要用与文件存放路径相类似的方式指出要操作的硬件设备(硬盘)。但是这里并不是用“DISK1”、“DISK2”等去标识某一块物理存在的硬盘。由于逻辑扇区是存在于逻辑分区上的,因此这里需要以某种特定的格式来指定需要访问的磁盘逻辑分区。对于逻辑分区X,其格式为”\\.\X:”。HANDLE CreateFile( LPCTSTR lpFileName, 
    DWORD dwDesiredAccess, 
    DWORD dwShareMode, 
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
    DWORD dwCreationDisposition, 
    DWORD dwFlagsAndAttributes, 
    HANDLE hTemplateFile );   CreateFile()函数原型如上所示,由于访问的是事实上已经存在的磁盘扇区,因此只能以OPEN_EXISTING标志设置dwCreationDisposition参数指出将要打开已经存在的文件(设备)。至于其他参数的使用与操作普通文件时的用法相同。
    通过CreateFile()打开的是整个磁盘逻辑分区,而要操作的是该分区的某些扇区,因此还要通过SetFilePointer()函数以文件操作的方式把指针移到要操作的磁盘扇区开始处。SetFilePointer()函数原型为:DWORD SetFilePointer(HANDLE hFile, 
    LONG lDistanceToMove, 
    PLONG lpDistanceToMoveHigh,
    DWORD dwMoveMethod);   参数hFile为CreateFile()返回的文件(设备)句柄;lDistanceToMove和lpDistanceToMoveHigh指出了要设置偏移量的低端和高端部分;dwMoveMethod指出文件指针从何处开始移动,可能的选项有FILE_START(从文件开始)、FILE_END(从文件结尾)和FILE_CURRENT(从文件当前位置)。  在定位到要访问的扇区开始位置后就可以通过ReadFile()或WriteFile()函数实施相应的读写访问了,具体操作与文件读写并没有什么太大的差别。最后,在完成访问操作后以CloseHandle()关闭文件句柄释放资源,从而完成一次完整的磁盘扇区数据访问操作。下面给出具体的读、写处理过程:BOOL CDirectAccessHDDlg::WriteSectors(BYTE bDrive, DWORD dwStartSector, WORD wSectors, LPBYTE lpSectBuff) 
    // 对磁盘扇区数据的写入
    {
     if (bDrive == 0) return 0;
     char devName[] = "\\\\.\\A:";
     devName[4] ='A' + bDrive - 1;
     HANDLE hDev = CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
     if (hDev == INVALID_HANDLE_VALUE) return 0;
     SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN);
     DWORD dwCB;
     BOOL bRet = WriteFile(hDev, lpSectBuff, 512 * wSectors, &dwCB, NULL);
     CloseHandle(hDev);
     return bRet;
    }
    BOOL CDirectAccessHDDlg::ReadSectors(BYTE bDrive, DWORD dwStartSector, WORD wSectors, LPBYTE lpSectBuff)
    // 对磁盘扇区数据的读取
    {
     if (bDrive == 0) return 0;
     char devName[] = "\\\\.\\A:";
     devName[4] ='A' + bDrive - 1;
     HANDLE hDev = CreateFile(devName, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
     if (hDev == INVALID_HANDLE_VALUE) return 0;
     SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN);
     DWORD dwCB;
     BOOL bRet = ReadFile(hDev, lpSectBuff, 512 * wSectors, &dwCB, NULL);
     CloseHandle(hDev);
     return bRet;

      

  2.   

    我不是说一个文件怎样写入硬盘,而是目录表、FAT表这些东西怎样强制写入硬盘
      

  3.   

    自己写驱动:
    MyBuffer* pMyBUF;
    MyBuffer* pMyBUF_W;
    pMyBUF->copyFrom(region,size,0,errCode);
    pMyBUF_W->copyTo(region_W,size_W,0,errCode);   就行了