2024年4月3日发(作者:)
WINDOWS文件操作
1. 打开和关闭文件:
HANDLE CreateFile(
LPCTSTR
lpFileName
, // file name
DWORD
dwDesiredAccess
, // access mode
DWORD
dwShareMode
, // share mode
LPSECURITY_ATTRIBUTES
lpSecurityAttributes
, // SD
DWORD
dwCreationDisposition
, // how to create
DWORD
dwFlagsAndAttributes
, // file attributes
HANDLE
hTemplateFile
// handle to template file
);
CreateFile函数相当强大,Windows下的底层设备差不多都是由它打开的。它可以创
建或打开文件、目录、物理磁盘、控制台缓冲区、邮槽和管道等。具体参考MSDN。
2. 移动文件指针:
DWORD SetFilePointer(
HANDLE
hFile
, // handle to file
LONG
lDistanceToMove
, // bytes to move pointer
PLONG
lpDistanceToMoveHigh
, // bytes to move pointer
DWORD
dwMoveMethod
// starting point
);
设置文件结尾标志:
BOOL SetEndOfFile(
HANDLE
hFile
// handle to file
);
该函数移动指定文件的结束标志到文件指针指向的位置。可用来截断或者扩展文件,
如果文件扩展,旧的EOF位置和新的EOF位置间的内容是未定义的。参考MSDN。
3. 文件读写:
BOOL ReadFile(
HANDLE
hFile
, // handle to file
LPVOID
lpBuffer
, // data buffer
DWORD
nNumberOfBytesToRead
, // number of bytes to read
LPDWORD
lpNumberOfBytesRead
, // number of bytes read
LPOVERLAPPED
lpOverlapped
// overlapped buffer
);
文件读取函数
BOOL WriteFile(
HANDLE
hFile
, // handle to file
LPCVOID
lpBuffer
, // data buffer
DWORD
nNumberOfBytesToWrite
, // number of bytes to write
LPDWORD
lpNumberOfBytesWritten
, // number of bytes written
LPOVERLAPPED
lpOverlapped
// overlapped buffer
);
文件写入函数,当Windows文件写文件时,写的的文件通常被Windows暂时保存
在内部的高速缓存中,等合适的时间再一并写入磁盘,可以调用FlushFileBuffer(HANDLE
hFile
// handle to file)函数来清空数据缓冲区
这两个函数可以同步读写文件,又可以异步读写文件。另外两个函数ReadFileEx和
WriteFileEx只能异步读写文件。比上面函数多了一个参数 :
LPOVERLAPPED_COMPLETION_ROUTINE
lpCompletionRoutine
//
completion routine
4. 文件锁定与解锁:
BOOL LockFile(
HANDLE
hFile
, // handle to file
DWORD
dwFileOffsetLow
, // low-order word of offset
DWORD
dwFileOffsetHigh
, // high-order word of offset
DWORD
nNumberOfBytesToLockLow
, // low-order word of length
DWORD
nNumberOfBytesToLockHigh
// high-order word of length
);
BOOL UnlockFile(
HANDLE
hFile
, // handle to file
DWORD
dwFileOffsetLow
, // low-order word of start
DWORD
dwFileOffsetHigh
, // high-order word of start
DWORD
nNumberOfBytesToUnlockLow
, // low-order word of length
DWORD
nNumberOfBytesToUnlockHigh
// high-order word of length
);
这两个函数用于当对文件数据一致性要求较高时,为防止程序在写入的过程中其他进
程刚好在读取写入的内容,可以对已打开文件的某个部分进行加锁。
函数参数中dwFileOffsetLow和dwFileOffsetHigh参数组合起来指定了加锁区域的
开始位置,nNumberOfBytesTLockLow和nNumberOfBytesToLockHigh参数组合起来
指定了加锁区域的大小。如果对文件进行了加锁后,当确定程序不在使用时,最好调用
UnlockFile显式的解锁,虽然操作系统会对其自动解锁,但操作系统解锁的用的时间取决
于当前可用的系统资源,所以有可能造成文件的无法访问。
5. 获取文件信息
DWORD GetFileType(
HANDLE
hFile
// handle to file
);
获取文件类型,其返回值可参考MSDN。
DWORD GetFileSize(
HANDLE
hFile
, // handle to file
LPDWORD
lpFileSizeHigh
// high-order word of file size
);
获取文件的大小,函数执行成功将返回文件大小的低双字,如果lpFileSizeHigh参数
不是NULL,函数将文件大小的高双字放入它指向的DWORD变量中
DWORD GetFileAttributes(
LPCTSTR
lpFileName
// name of file or directory
);
如果要查看文件或者目录的属性,可以使用GetFileAttributes函数,它会返回一系列
的FAT风格属性信息。返回值可参考MSDN。
BOOL SetFileAttributes(
LPCTSTR
lpFileName
, // file name
DWORD
dwFileAttributes
// attributes
);
设置文件属性
BOOL GetFileTime(
HANDLE
hFile
, // handle to file
LPFILETIME
lpCreationTime
, // creation time
LPFILETIME
lpLastAccessTime
, // last access time
LPFILETIME
lpLastWriteTime
// last write time
);
获取文件时间,有三个文件时间可供获取:创建时间、最后访问时间、最后写时间。
参数具体信息可参考MSDN
BOOL GetFileInformationByHandle(
HANDLE
hFile
, // handle to file
LPBY_HANDLE_FILE_INFORMATION
lpFileInformation
// buffer
);
获取所有文件信息,该函数能够获取文件的所有信息,如大小,属性等,另外还有一
些其它信息,如文件卷标,索引和链接信息。返回信息保存在lpFileInformation所指向
的BY_HANDLE_FILE_INFORMATION中
typedef struct _BY_HANDLE_FILE_INFORMATION {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD dwVolumeSerialNumber;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD nNumberOfLinks;
DWORD nFileIndexHigh;
DWORD nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION;
关于此结构的具体信息参考MSDN。
DWORD GetFullPathName(
LPCTSTR
lpFileName
, // file name
DWORD
nBufferLength
, // size of path buffer
LPTSTR
lpBuffer
, // path buffer
LPTSTR
*
lpFilePart
// address of file name in path
);
获取文件的完整路径,需要提醒的是:只有当该文件在当前目录下,结果才正确。如
果要得到真正的路径。应该用GetModuleFileName函数。
DWORD GetModuleFileName(
HMODULE
hModule
, // handle to module
LPTSTR
lpFilename
, // path buffer
DWORD
nSize
// size of buffer
);
hModule HMODULE 装载一个程序实例的句柄。如果该参数为NULL,该函数返回
该当前应用程序全路径。
lpFileName LPTSTR 是你存放返回的名字的内存块的指针,是一个输出参数 nSize
DWORD ,装载到缓冲区lpFileName的最大值
如果返回为成功,将在lpFileName的缓冲区当中返回相应模块的路径,如果所为的
nSize过小,哪么返回仅按所设置缓冲区大小返回相应字符串内容。如果函数失败,返回
值将为0,并返回GetLastError异常代码。
DWORD GetModuleFileNameEx(
HANDLE
hProcess
, // handle to process
HMODULE
hModule
, // handle to module
LPTSTR
lpFilename
, // path buffer
DWORD
nSize
// maximum characters to retrieve
);
与上一个函数的不同在于多了一个与进程相关的句柄,如果为NULL则lpFilename
的值为当前程序的全路径。
DWORD GetTempPath(
DWORD
nBufferLength
, // size of buffer
LPTSTR
lpBuffer
// path buffer
);
获取Windows临时文件路径。
UINT GetTempFileName(
LPCTSTR
lpPathName
, // directory name
LPCTSTR
lpPrefixString
, // file name prefix
UINT
uUnique
, // integer
LPTSTR
lpTempFileName
// file name buffer
);
在Windows临时目录下创建一个唯一的临时文件。具体参数信息参考MSDN。
WINSHELLAPI DWORD WINAPI SHGetFileInfo(
LPCTSTR
pszPath
,
DWORD
dwFileAttributes
,
SHFILEINFO FAR
*psfi
,
UINT
cbFileInfo
,
UINT
uFlags
);
获取系统文件信息,如文件,文件夹,目录,驱动器目录
pszPath 参数:指定的文件名。
当uFlags的取值中不包含 SHGFI_PIDL时,可直接指定;
当uFlags的取值中包含 SHGFI_PIDL时pszPath要通过计算获得,不能直接指定;
dwFileAttributes参数:文件属性。
仅当uFlags的取值中包含SHGFI_USEFILEATTRIBUTES时有效,一般不用此参数;
psfi 参数:返回获得的文件信息,是一个记录类型,有以下字段:
_SHFILEINFOA = record
hIcon: HICON; { out: icon } //文件的图标句柄
iIcon: Integer; { out: icon index } //图标的系统索引号
dwAttributes: DWORD; { out: SFGAO_ flags } //文件的属性值
szDisplayName: array [0..MAX_PATH-1] of AnsiChar; { out: display name (or
path) } //文件的显示名
szTypeName: array [0..79] of AnsiChar; { out: type name } //文件的类型名
end;
cbFileInfo 参数:psfi的比特值;
uFlags 参数:指明需要返回的文件信息标识符,常用的有以下常数:
SHGFI_ICON; //获得图标
SHGFI_DISPLAYNAME; //获得显示名
SHGFI_TYPENAME; //获得类型名
SHGFI_ATTRIBUTES; //获得属性
SHGFI_LARGEICON; //获得大图标
SHGFI_SMALLICON; //获得小图标
SHGFI_PIDL; // pszPath是一个标识符
函数SHGetFileInfo()的返回值也随uFlags的取值变化而有所不同。
可见通过调用SHGetFileInfo()可以由psfi参数得到文件的图标句柄。但要注意在
uFlags参数中不使用SHGFI_PIDL时,SHGetFileInfo()不能获得“我的电脑”等虚似文件
夹的信息。
应该注意的是,在调用SHGetFileInfo()之前,必须使用 CoInitialize 或者
OleInitialize 初始化COM,否则表面上能够使用,但是会造成不安全或者丧失部分功能
6. 文件拷贝、删除、移动
BOOL CopyFile(
LPCTSTR
lpExistingFileName
, // name of an existing file
LPCTSTR
lpNewFileName
, // name of new file
BOOL
bFailIfExists
// operation if file exists
);
BOOL CopyFileEx(
LPCTSTR
lpExistingFileName
, // name of existing file
LPCTSTR
lpNewFileName
, // name of new file
LPPROGRESS_ROUTINE
lpProgressRoutine
, // callback function
LPVOID
lpData
, // callback parameter
LPBOOL
pbCancel
, // cancel status
DWORD
dwCopyFlags
// copy options
);
文件拷贝函数,CopyFileEx函数附加功能是允许指定一个回调函数,在拷贝过程中,
函数每拷贝完一部分数据,就会调用回调函数,回调函数则可由用户指定操作。
BOOL DeleteFile(
LPCTSTR
lpFileName
// file name
);
文件删除函数,当文件不存在或者文件属性为只读,函数会执行失败,对于只读文件,
在删除前就去掉其只读属性。用DeleteFile函数删除的文件不会被放到回收站,它们将永
远丢失。
BOOL MoveFile(
LPCTSTR
lpExistingFileName
, // file name
LPCTSTR
lpNewFileName
// new file name
);
BOOL MoveFileEx(
LPCTSTR
lpExistingFileName
, // file name
LPCTSTR
lpNewFileName
, // new file name
DWORD
dwFlags
// move options
);
文件移动函数,其主要功能都是用来移动一个存在的文件或目录,当需要指定文件如
何移动时,则用MoveFileEx函数,其dwFlags指定文件移动方式,具体说明可参考MSDN。
7. 文件查找
HANDLE FindFirstFile(
LPCTSTR
lpFileName
, // file name
LPWIN32_FIND_DATA
lpFindFileData
// data buffer
);
HANDLE FindFirstFileEx(
LPCTSTR
lpFileName
, // file name
FINDEX_INFO_LEVELS
fInfoLevelId
, // information level
LPVOID
lpFindFileData
, // information buffer
FINDEX_SEARCH_OPS
fSearchOp
, // filtering type
LPVOID
lpSearchFilter
, // search criteria
DWORD
dwAdditionalFlags
// reserved
);
该函数到一个文件夹(包括子文件夹)去搜索指定文件 如果要使用附加属性去搜索文
件的话 可以使用FindFirstFileEx函数。HANDLE hFindFile搜索的文件句柄 函数执行的
时候搜索的是此句柄的下一文件
LPWIN32_FIND_DATA lpFindFileData 指向一个用于保存文件信息的结构体
函数调用成功后,其返回值可用作FindNextFile或FindClose函数的参数。
BOOL FindNextFile(
HANDLE
hFindFile
, // search handle
LPWIN32_FIND_DATA
lpFindFileData
// data buffer
);
在FindFirstFile函数调用成功后继续查找文件。
8. 压缩文件操作
INT LZOpenFile(
LPTSTR
lpFileName
, // file name
LPOFSTRUCT
lpReOpenBuf
, // file information buffer
WORD
wStyle
// action to take
);
创建,打开,删除压缩文件。参数信息参考MSDN。
VOID LZClose(
INT
hFile
// LZ file handle
);
关闭压缩文件,参数为LPOpenFile返回的值。
LONG LZCopy(
INT
hfSource
, // LZ file handle for source file
INT
hfDest
// LZ file handle for destination file
);
复制压缩文件并在处理过程中展开,函数的两个参数都可以用LPOpenFile函数得到,
只要指定LPOpenFile函数wStyle的不同值。
INT GetExpandedName(
LPTSTR
lpszSource
, // name of compressed file
LPTSTR
lpszBuffer
// original file name
);
从压缩文件中返回文件名称,参数信息参考MSDN。


发布评论