windows文件处理---Win32
2007-11-18 22:06
429 查看
1. WIN32_FIND_DATA结构
关于文件的全部属性信息,总计有以下9种:文件的标题名,文件的属性(只读,存档,隐藏等),文件的创建时间,文件的最后访问时间,文件的最后修改时间,文件大小的高双位字节,文件大小的低双位字节,保留,保留。
在使用FindFirstFile()和FindNextFile()函数去查找磁盘文件时,经常使用的一个数据结构WIN32_FIND_DATA的成员变量包含了以上所有文件属性,因此可以通过这个数据结构作为获取和更改文件属性的手段。该结构的内容如下:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; // 文件创建时间
FILETIME ftLastAccessTime; // 文件最后一次访问时间
FILETIME ftLastWriteTime; // 文件最后一次修改时间
DWORD nFileSizeHigh; // 文件长度高32位
DWORD nFileSizeLow; // 文件长度低32位
DWORD dwReserved0; // 系统保留
DWORD dwReserved1; // 系统保留
TCHAR cFileName[ MAX_PATH ]; // 长文件名
TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
可以通过FindFirstFile()函数根据当前文件存在路径查找该文件,来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中,
WIN32_FIND_DATA ffd;
HANDLE hFile = FindFirstFile("c://test.dat", &ffd);
在使用这个结构的时候不能手工修改这个结构中的任何数据,结构对于开发人员来说只能是只读数据,其所有成员变量都会由系统完成填写。
2. FindFirstFile
原形:
HANDLE WINAPI FindFirstFileW(
__in LPCWSTR lpFileName, // 文件名:可以使用指定文件名,也可以使用*.*,必须指定路径
__out LPWIN32_FIND_DATAW lpFindFileData // WIN32_FIND_DATA结构指针
);
3. FindNextFile
原形:
BOOL WINAPI FindNextFileW(
__in HANDLE hFindFile, // hFile handle
__out LPWIN32_FIND_DATAW lpFindFileData // WIN32_FIND_DATA结构指针
);
注意:
返回类型为BOOL型
4. GetCurrentDirectory
原形:
DWORD WINAPI GetCurrentDirectoryW(
__in DWORD nBufferLength,
__out_ecount_part_opt(nBufferLength, return + 1) LPWSTR lpBuffer
);
5. strcmpi
原形:
int strcmpi(const char* str1, const char* str2);
6. CompareFileTime
原形:
int CompareFileTime(LPFILETIME fileTime1, LPFILETIME fileTime2);
7. DeleteFile与CopyFile
8. 示例
// console.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#define FILE_MAX 300
int _tmain(int argc, _TCHAR* argv[])
{
int i, j, nSrcFiles, nDestFiles;
HANDLE hFile;
WIN32_FIND_DATA fd, srcFiles[FILE_MAX], destFiles[FILE_MAX];
BOOL bRet = TRUE;
TCHAR src[MAX_PATH+1], dest[MAX_PATH+1], destpath[MAX_PATH+1];
DWORD dwcNameSize = MAX_PATH + 1;
TCHAR szBuf[MAX_PATH+1];
lstrcpy(src, argv[1]);
GetCurrentDirectory(dwcNameSize, szBuf);
lstrcpy(dest, szBuf);
lstrcpy(destpath, szBuf);
lstrcat(src, "//*.*"); // c:/document/*.*
lstrcat(dest, "//*.*"); // d:/document/*.*
nSrcFiles = 0; // display files of src directory
bRet = TRUE;
hFile = FindFirstFile(src, &fd);
while (hFile != INVALID_HANDLE_VALUE && bRet)
{
if (fd.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE)
srcFiles[nSrcFiles] = fd; // add to an fd array
printf("srcFiles[%d]: %s/n", nSrcFiles, fd.cFileName);
nSrcFiles++;
bRet = FindNextFile(hFile, &fd);
}
nDestFiles = 0; // display files of dest directory
bRet = TRUE;
hFile = FindFirstFile(dest, &fd);
while (hFile != INVALID_HANDLE_VALUE && bRet)
{
if (fd.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE)
destFiles[nDestFiles] = fd; // add to an fd array
printf("destFiles[%d]: %s/n", nDestFiles, fd.cFileName);
nDestFiles++;
bRet = FindNextFile(hFile, &fd);
}
for(i=2;i<nSrcFiles;i++)
{
for (j=0;j<nDestFiles;j++)
{
if(strcmpi(srcFiles[i].cFileName, destFiles[j].cFileName) == 0)
{
printf("Match File: %s/n", srcFiles[i].cFileName);
if (CompareFileTime(&srcFiles[i].ftLastWriteTime,&destFiles[j].ftLastWriteTime) > 0)
{
printf("File is modified: %s/n", srcFiles[i].cFileName);
strcpy(dest, destpath);
strcat(dest,"//");
strcat(dest, srcFiles[i].cFileName);
printf("copy file: %s/n", dest);
DeleteFile(dest);
CopyFile(srcFiles[i].cFileName, dest, FALSE); // FALSE is Overwrite
}
}
}
}
return 0;
}
关于文件的全部属性信息,总计有以下9种:文件的标题名,文件的属性(只读,存档,隐藏等),文件的创建时间,文件的最后访问时间,文件的最后修改时间,文件大小的高双位字节,文件大小的低双位字节,保留,保留。
在使用FindFirstFile()和FindNextFile()函数去查找磁盘文件时,经常使用的一个数据结构WIN32_FIND_DATA的成员变量包含了以上所有文件属性,因此可以通过这个数据结构作为获取和更改文件属性的手段。该结构的内容如下:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; // 文件创建时间
FILETIME ftLastAccessTime; // 文件最后一次访问时间
FILETIME ftLastWriteTime; // 文件最后一次修改时间
DWORD nFileSizeHigh; // 文件长度高32位
DWORD nFileSizeLow; // 文件长度低32位
DWORD dwReserved0; // 系统保留
DWORD dwReserved1; // 系统保留
TCHAR cFileName[ MAX_PATH ]; // 长文件名
TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
可以通过FindFirstFile()函数根据当前文件存在路径查找该文件,来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中,
WIN32_FIND_DATA ffd;
HANDLE hFile = FindFirstFile("c://test.dat", &ffd);
在使用这个结构的时候不能手工修改这个结构中的任何数据,结构对于开发人员来说只能是只读数据,其所有成员变量都会由系统完成填写。
2. FindFirstFile
原形:
HANDLE WINAPI FindFirstFileW(
__in LPCWSTR lpFileName, // 文件名:可以使用指定文件名,也可以使用*.*,必须指定路径
__out LPWIN32_FIND_DATAW lpFindFileData // WIN32_FIND_DATA结构指针
);
3. FindNextFile
原形:
BOOL WINAPI FindNextFileW(
__in HANDLE hFindFile, // hFile handle
__out LPWIN32_FIND_DATAW lpFindFileData // WIN32_FIND_DATA结构指针
);
注意:
返回类型为BOOL型
4. GetCurrentDirectory
原形:
DWORD WINAPI GetCurrentDirectoryW(
__in DWORD nBufferLength,
__out_ecount_part_opt(nBufferLength, return + 1) LPWSTR lpBuffer
);
5. strcmpi
原形:
int strcmpi(const char* str1, const char* str2);
6. CompareFileTime
原形:
int CompareFileTime(LPFILETIME fileTime1, LPFILETIME fileTime2);
7. DeleteFile与CopyFile
8. 示例
// console.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#define FILE_MAX 300
int _tmain(int argc, _TCHAR* argv[])
{
int i, j, nSrcFiles, nDestFiles;
HANDLE hFile;
WIN32_FIND_DATA fd, srcFiles[FILE_MAX], destFiles[FILE_MAX];
BOOL bRet = TRUE;
TCHAR src[MAX_PATH+1], dest[MAX_PATH+1], destpath[MAX_PATH+1];
DWORD dwcNameSize = MAX_PATH + 1;
TCHAR szBuf[MAX_PATH+1];
lstrcpy(src, argv[1]);
GetCurrentDirectory(dwcNameSize, szBuf);
lstrcpy(dest, szBuf);
lstrcpy(destpath, szBuf);
lstrcat(src, "//*.*"); // c:/document/*.*
lstrcat(dest, "//*.*"); // d:/document/*.*
nSrcFiles = 0; // display files of src directory
bRet = TRUE;
hFile = FindFirstFile(src, &fd);
while (hFile != INVALID_HANDLE_VALUE && bRet)
{
if (fd.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE)
srcFiles[nSrcFiles] = fd; // add to an fd array
printf("srcFiles[%d]: %s/n", nSrcFiles, fd.cFileName);
nSrcFiles++;
bRet = FindNextFile(hFile, &fd);
}
nDestFiles = 0; // display files of dest directory
bRet = TRUE;
hFile = FindFirstFile(dest, &fd);
while (hFile != INVALID_HANDLE_VALUE && bRet)
{
if (fd.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE)
destFiles[nDestFiles] = fd; // add to an fd array
printf("destFiles[%d]: %s/n", nDestFiles, fd.cFileName);
nDestFiles++;
bRet = FindNextFile(hFile, &fd);
}
for(i=2;i<nSrcFiles;i++)
{
for (j=0;j<nDestFiles;j++)
{
if(strcmpi(srcFiles[i].cFileName, destFiles[j].cFileName) == 0)
{
printf("Match File: %s/n", srcFiles[i].cFileName);
if (CompareFileTime(&srcFiles[i].ftLastWriteTime,&destFiles[j].ftLastWriteTime) > 0)
{
printf("File is modified: %s/n", srcFiles[i].cFileName);
strcpy(dest, destpath);
strcat(dest,"//");
strcat(dest, srcFiles[i].cFileName);
printf("copy file: %s/n", dest);
DeleteFile(dest);
CopyFile(srcFiles[i].cFileName, dest, FALSE); // FALSE is Overwrite
}
}
}
}
return 0;
}
相关文章推荐
- DirectX 因素:在 Windows 8 中流式载入和处理音频文件
- 怎么处理windows登录弹出不能加载本地存储文件?
- Java nio按行处理文件(兼容Linux与Windows)
- MAC处理windows上传的txt文件 换行问题
- No buffer space available 和windows 2003复制文件时:配额不足,无法处理该命令
- 把windows下的文件拷贝到linux下-关于回车键的处理
- Windows 对 DLL 文件的一些处理
- windows 8/10 文件、文件夹需要管理员权限处理办法
- 同一个文件Linux环境下和windows环境下md5_file处理出来的结果不一致
- [转载]XP向windows 7传输文件时系统提示“服务器存储空间不足,无法处理此命令”故障的解决方法
- 在Windows上处理BinHex文件
- 项目文件必须在引用列表中包含.net framework 程序集“WindowsBase,PresentationCore,PresentationFramework”。错误处理!
- windows和linux对文件目录的处理
- linux 下windows 文件中文乱码处理
- nginx win32 版本静态文件测试 (Windows环境)
- windows计划任务+批处理文件实现oracle数据库的定时备份与恢复
- cs0016: 未能写入输出文件“c:\windows\microsoft.net\***.dll”错误处理
- js仿windows文件与文件夹处理
- cs0016: 未能写入输出文件“c:\windows\microsoft.net\***.dll”错误处理
- 关于《简明Python教程》中在Windows下编写压缩文件脚本出错的处理