操作windows文件的几个API函数

CreateFile

函数原型:
  HANDLE CreateFile(   
        LPCTSTR lpFileName, //指向文件名的指针   
        DWORD dwDesiredAccess, //访问模式(写/读)  
       DWORD dwShareMode, //共享模式   
        LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针  
       DWORD dwCreationDisposition, //如何创建  
       DWORD dwFlagsAndAttributes, //文件属性  
       HANDLE hTemplateFile //用于复制文件句柄
    );

参数列表:
lpFileName String
     要打开的文件的名或设备名。这个字符串的最大长度在ANSI版本中为MAX_PATH,在unicode版本中为32767。
   
dwDesiredAccess Long
     如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息。
 
dwShareMode Long,
     零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允许对文件进行共享访。

lpSecurityAttributes SECURITY_ATTRIBUTES
     指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
  
dwCreationDisposition Long,
下述常数之一:   
    CREATE_NEW 创建文件;如文件存在则会出错  
   CREATE_ALWAYS 创建文件,会改写前一个文件  
   OPEN_EXISTING 文件必须已经存在。由设备提出要求   
    OPEN_ALWAYS 如文件不存在则创建它   
    TRUNCATE_EXISTING 讲现有文件缩短为零长度  
 
dwFlagsAndAttributes Long,
一个或多个下述常数   
    FILE_ATTRIBUTE_ARCHIVE 标记归档属性   
    FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式   
    FILE_ATTRIBUTE_NORMAL 默认属性  
   FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录   
    FILE_ATTRIBUTE_READONLY 文件为只读  
   FILE_ATTRIBUTE_SYSTEM 文件为系统文件  
   FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作      
    FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
  FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块    
    FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化       
    FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化     
    FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件 。
---------------------------------------------------------
WriteFile

函数原型:
  BOOL WriteFile(   
       HANDLE hFile, // 文件句柄   
       LPCVOID lpBuffer, // 数据缓存区指针  
      DWORD nNumberOfBytesToWrite, // 你要写的字节数  
      LPDWORD lpNumberOfBytesWritten, // 用于保存实际写入字节数的存储区域的指针      LPOVERLAPPED lpOverlapped // OVERLAPPED结构体指针  
   );

参数列表:
HANDLE hFile
    需要写入数据的文件指针,这个指针指向的文件必须是GENERIC_WRITE access 访问属性的文件。
LPCVOID lpBuffer
    lpBuffer为LPCVOID,所以任何数据类型的指针都可以。
DWORD nNumberOfBytesToWrite
    lpBuffer指向的数据的字节数。
LPDWORD lpNumberOfBytesWritten
    用于保存实际写入字节数的存储区域的指针,例如:DWORD dw 即可。 
LPOVERLAPPED lpOverlapped
    OVERLAPPED结构体指针,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL。

--------------------------------------------------------

SetFilePointer

函数原型:
DWORD SetFilePointer(   
    HANDLE hFile, // 文件句柄   
    LONG lDistanceToMove, // 偏移量(低位)  
   PLONG lpDistanceToMoveHigh, // 偏移量(高位)  
   DWORD dwMoveMethod // 基准位置,FILE_BEGIN:文件开始位置 ,FILE_CURRENT:文件当前位置, FILE_END:文件结束位置   
);
--------------------------------------------------------

DeleteFile

函数原型:
 BOOL DeleteFile(
    LPCTSTR lpFileName // 文件名指针
  );

--------------------------------------------------------

MoveFile

函数原型:
BOOL MoveFile(  
   LPCTSTR lpExistingFileName, // file name   
    LPCTSTR lpNewFileName // new file name  
   );   
函数功能 :  移动一个存在的文件或者目录(包括子目录)   
参数说明 :  
lpExistingFileName 一个存在的文件或者文件夹字符串指针   
lpNewFileName 一个还没存在的文件或者文件夹的字符串指针
----------------------------------------------------------

MoveFileEx

函数原型:
BOOL MoveFileEx(
  LPCTSTR lpExistingFileName,  // file name
  LPCTSTR lpNewFileName,       // new file name
  DWORD dwFlags                // move options
);

参数说明:
lpExistingFileName,一个存在的文件或者文件夹字符串指针  
lpNewFileName ,一个还没存在的文件或者文件夹的字符串指针
dwFlags ,一个或多个下述常数:
MOVEFILE_COPY_ALLOWED
    如移动到一个不同的卷,则复制文件并删除原来的文件。

MOVEFILE_CREATE_HARDLINK
    系统保留,以供将来使用。

MOVEFILE_DELAY_UNTIL_REBOOT
    移动操作在系统下次重新启动时正式进行。注册表修改处:HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet /Control/Session/Manager/PendingFileRenameOperations。

MOVEFILE_FAIL_IF_NOT_TRACKABLE
    如果来源文件是一个 LINK 文件,但是文件在移动后不能够被 TRACKED,则函数执行失败。如果目标文件在一个 FAT 格式的文件系统上,则上述情况可以发生。这个参数不支持 NT 系统。(我想这里说的可能是移动快捷方式的情况,如果快捷方式指定的目标文件不存在或无法定位,则操作失败,由于没有时间测试,暂时这样理解。)

MOVEFILE_REPLACE_EXISTING
    如目标文件存在,则将其替换 。

MOVEFILE_WRITE_THROUGH
    这个标记允许函数在执行完文件移动操作后才返回,否者不等文件移动完毕就直接返回。如果设置了 MOVEFILE_DELAY_UNTIL_REBOOT 标记,则 MOVEFILE_WRITE_THROUGH 标记将被忽略。

 

例如:
//对于已经存在的txt文件追加信息
void CTestDlg::OnBtnTest()

 CString path(_T("test.txt"));
 //OPEN_ALWAYS保证原文件不会被删除,以及原来文件内容不被修改
 HANDLE hHandle = CreateFile(path.GetBuffer(0),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
 if(hHandle == INVALID_HANDLE_VALUE)
  MessageBox("Failed");
 else
 {
  DWORD dw;
  CString sText(_T("test"));
  //将文件指针指向文件结束位置,达到追加的效果
  SetFilePointer(hHandle,0,NULL,FILE_END);
  if(WriteFile(hHandle,sText.GetBuffer(0),sText.GetLength(),&dw,NULL))
   MessageBox("ok");
  //再次追加
  SetFilePointer(hHandle,0,NULL,FILE_END);
  if(WriteFile(hHandle,sText.GetBuffer(0),sText.GetLength(),&dw,NULL))
   MessageBox("ok1");
 }


 
 //删除文件,如果失败,再用MovieFileEx
 if(!DeleteFile(path.GetBuffer(0)))
 {
  MoveFileEx(path.GetBuffer(0),NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
 }

 //之所以在这才关闭,是为了验证MoveFileEx
 CloseHandle(hHandle);
}

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值