2013年(6)
分类: C/C++
2013-04-01 15:15:57
VC++ 对文件或目录的搜索、保存、修改与删除等操作
#include
以下函数可用于保存功能:
1、在连接的计算机上创建一个文件目录
BOOL CreateDirectory(
LPCTSTR pstrDirName
);
这是WinAPI函数,就不给出源代码了。
//将一个目录的内容pszSrcDir复制到另一个目录pszDesDir下
2、CopyDirToDir()
BOOL CopyDirToDir(wchar_t *pszSrcDir,wchar_t *pszDesDir)
{
SHFILEOPSTRUCT FileOp = {0};
FileOp.fFlags = FOF_NOCONFIRMATION;
FileOp.lpszProgressTitle = NULL;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.pTo = pszDesDir;
FileOp.wFunc = FO_COPY;
FileOp.pFrom = pszSrcDir;
return SHFileOperation(&FileOp) == 0;
}
其中 SHFileOperation(&FileOp) 可用于
Copies, moves, renames, or deletes a file system object.
3、复制一个文件lpExistingFileName到一个新的路径下lpNewFileName
BOOL CopyFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
BOOL bFailIfExists
);
如果bFailIfExists为TRUE,那么当lpNewFileName路径复制前已经存在时,
那么函数CopyFile不执行,否则函数照样执行并且覆盖以前的文件。
4、获得运行程序的满路径(Full Path)的API函数: GetModuleFileName()
DWORD GetModuleFileName(
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize);
hModule
[in] Handle to the module whose path is being requested.
If hModule is NULL,
GetModuleFileName retrieves the path for the current module.
lpFilename
[out]输出不存在终止符'\0'的程序路径(Full Path)
nSize
[in] Size of the lpFilename buffer, in TCHARs. 可指定为 MAX_PATH 即:260
_wsplitpath 或 _splitpath 解析满路径的API函数。
如:_wsplitpath( FullPath, drive, dir, filename, ext );
其中:
FullPath为输入的满路径,
drive为驱动器,
dir为没有驱动器与文件名的目录,
filename为文件名,
ext为文件扩展名。
以下函数可用于修改文件名称的功能:
将文件从一个目录lpExistingFileName移动到另一个目录lpNewFileName
BOOL MoveFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName
);
移动时包含子文件夹的内容也一同移过去,具体如何移动,
也可用另一个扩展函数
BOOL MoveFileEx(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
DWORD dwFlags
);
其中dwFlags可以指定不同的移动方式。
以下函数可用于删除文件
API函数DeleteFile()
BOOL DeleteFile(
LPCTSTR lpFileName
);
//自定义的函数,删除某个文件FullPathName
//功能更加强大,可以将只读的文件一并删除
//FullPathName = 文件绝对路径 + 文件名
bool MyDeleteFile(wchar_t* FullPathName)
{
ASSERT(FullPathName != NULL);
DWORD dwAttrs;
//获取文件属性
dwAttrs=GetFileAttributesW(FullPathName);
//如果为只读属性,则去除
if (dwAttrs & FILE_ATTRIBUTE_READONLY)
{
SetFileAttributes(FullPathName,
dwAttrs & ~FILE_ATTRIBUTE_READONLY);
}
if(!SUCCEEDED(DeleteFile(FullPathName)))
{
//删除失败
return false;
}
//删除成功
return true;
}
//自定义的函数,删除目录与目录下所有的子文件夹、文件。
//功能更加强大,可以将只读的文件一并删除
BOOL MyDeleteDir(wchar_t *DirName)
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
DWORD dwAttrs;
wchar_t tempFileFind[MAX_PATH];
wsprintf(tempFileFind,L"%s\\*.*",DirName);
//搜索第一个符合文件目录或文件名tempFileFind的文件
//可用FindNextFile继续搜索下一个在相同目录下的文件
//可用FindClose(hSearch);结束搜索。具体用法看下文。
//The FindFirstFile function searches a directory for a file
//whose name matches the specified file name.
//FindFirstFile 同样搜索子目录下的文件.
hSearch = FindFirstFileW(tempFileFind, &FileData);
int a=GetLastError();
BOOL bFinished=FALSE;
if (hSearch==INVALID_HANDLE_VALUE)
{
bFinished=TRUE;
}
while(!bFinished)
{
wchar_t foundFileName[MAX_PATH];
if(FileData.cFileName[0]!='.')
{
wcscpy(foundFileName,FileData.cFileName);
if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
wchar_t tempDir[MAX_PATH];
wsprintf(tempDir,L"%s\\%s",DirName,foundFileName);
MyDeleteDir(tempDir);
}
else
{
wchar_t tempFileName[MAX_PATH];
wsprintf(tempFileName,L"%s\\%s",DirName,foundFileName);
//获取文件的属性,如只读属性 FILE_ATTRIBUTE_READONLY
dwAttrs = GetFileAttributesW(tempFileName);
//设置文件属性为非只读~FILE_ATTRIBUTE_READONLY);
SetFileAttributes(tempFileName,
dwAttrs & ~FILE_ATTRIBUTE_READONLY);
if(!DeleteFileW(tempFileName))
{
dwAttrs=GetFileAttributesW(tempFileName);
if (dwAttrs & FILE_ATTRIBUTE_READONLY)
{
SetFileAttributes(tempFileName,
dwAttrs & ~FILE_ATTRIBUTE_READONLY);
}
if(!DeleteFileW(tempFileName))
{
}
}
}
}
if (!FindNextFileW(hSearch,&FileData))
{
bFinished=TRUE;
}
}
FindClose(hSearch);
//删除目录DirName,用以下三种的其中一种,只是编译环境不同而已,功能一样
//RemoveDirectory或者RemoveDirectoryW或者RemoveDirectoryA
if(!RemoveDirectoryW(DirName))
{
return FALSE;
}
return TRUE;
}
//如果当前文件名FileName在目录下FullPath已经存在。
//自定义的函数:实现重命名文件名
wchar_t* RenameExitFile(wchar_t* FullPath,wchar_t* FileName)
{
ASSERT(FileName != NULL && FullPath != NULL);
//返回的文件名称
wchar_t wcsMediaName[MAX_PATH] = {0};
wcscpy(wcsMediaName,FileName);
//全路径:文件路径加文件名
wchar_t szDestFile[MAX_PATH] = {0};
wsprintf(szDestFile, L"%s\\%s", FullPath, FileName);
//判断文件资源是否已经存在
if(_waccess(szDestFile,0) == 0)
{
//临时文件路径
<