PC端文件及目录的管理总结
来源:互联网 发布:启明教育软件下载 编辑:程序博客网 时间:2024/05/16 18:16
最近一个项目要处理的是PC机上文件及目录的管理。无非就是文件的新建、删除、拷贝、剪切、粘贴、移动、更名,目录的创建、删除、拷贝、剪切、粘贴、移动、更名操作。主要设计文件和目录两个对象,每个对象包含对应的方法。
一、文件
新建:创建一个由客户输入带文件扩展名的文件;删除:直接删除鼠标选中的文件;拷贝:将选中文件的路径拷贝到剪贴板中,附加一个拷贝标志;剪切:将选中的文件路径拷贝到剪贴板中,附加一个剪切标志;粘贴:将剪贴板中文件路径的文件粘贴到当前路径,并根据拷贝或剪切标志决定是否删除源文件;移动:和剪切一个文件类似,不过可能是直接操作目录链接的方式;更名:直接更改文件名称;
二、目录
创建:创建一个客户输入名称的文件夹;删除:先删除目录中的所有文件,如果还有子目录则先递归到最下级子目录,删除子目录中的所有文件,然后一级一级回到主目录,最后删除该空目录;拷贝:将选中目录的路径拷贝到剪贴板中,附加一个拷贝标志;剪切:将选中的目录路径拷贝到剪贴板中,附加一个剪切标志;粘贴:将剪贴板中的目录路径粘贴到当前路径,并根据拷贝或剪切标志决定是否删除源目录,如果要删除源目录和删除目录处理过程一致;移动:更改目录的链接路径;更名:直接更改目录名称;
拷贝文件和目录代码:
...{
::CreateDirectory((LPCTSTR)strDest,NULL);
WIN32_FIND_DATA wfd;
HANDLE hFile=::FindFirstFile(_T("*.*"),&wfd);
if(hFile!=INVALID_HANDLE_VALUE)
...{
do
...{
CString strFileName=wfd.cFileName;
if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
...{
CString strFolderName=wfd.cFileName;
if(strFolderName!=_T(".")&&strFolderName!=_T(".."))
...{
::SetCurrentDirectory(wfd.cFileName);
CopyAllFileAndFolder(strDest+_T("/"+strFolderName);
::SetCurrentDirectory(_T(".."));
}
}
else
...{
::CopyFile(wfd.cFileName,strDest+_T("/")+strFileName,FALSE);
}
}while(::FindNextFile(hFile,&wfd));
::FindClose(hFile);
}
}
另外一种是调用CopyFile函数
CopyFile
语法:CopyFile (szSrcFile, szTargetFile);
说明:CopyFile函数创建一个由参数szSrcFile指定的文件的拷贝。新文件由参数szTargetFile指定文件名。
参数:
szSrcFile
指定要拷贝的文件的文件名。如果该文件名是限定的,也就是,如果它包括一个路径,CopyFile将从指定位置拷贝该文件。如果szSrcFile包含一个未限定文件名,也就是,没有路径信息,CopyFile将从由系统变量SRCDIR标识的路径拷贝。为拷贝一组文件,在该参数位置使用通配符。
szTargetFile
指定给由szSrcFile标识的文件的拷贝的名称。如果文件名是限定的,也就是,如果它包含一个路径,CopyFile将把文件拷贝到路径指定的位置。如果szSrcFile包含一个未限定文件名,也就是,没有路径信息,拷贝将被创建在由系统变量TARGETDIR指定的目录中。如果目标目录不存在,它将被创建。
当由szSrcFile指定的文件名中包含一个通配符时,szTargetFile的文件名部分被忽略;每个源文件以它的现存名被拷贝到由szTargetFile指定的路径。如果szTargetFile包含一个未限定文件名,文件将被拷贝到由系统变量TARGETDIR指定的目录中。因此,CopyFile不能被用来拷贝和重命名一组文件。当szSrcFile包含一个或多个通配符时,源目录和目标目录必须不同。
返回值:
0:表明函数成功地从源目录拷贝文件至目标目录。
< 0:表明函数因下列情况之一未能拷贝所要文件:
COPY_ERR_CREATEDIR (-27):目标目录不能被创建。确保系统变量TARGETDIR中的路径语法正确并且你有权访问目标驱动器。
COPY_ERR_MEMORY (-6):函数未能分配完成拷贝文件进程所需的内存。尽可能多地终止正在运行的应用程序以释放内存。
COPY_ERR_NODISKSPACE (-38):函数未能在目标驱动器上找到足够的磁盘空间来拷贝文件。在目标驱动器上释放磁盘空间。
COPY_ERR_OPENINPUT (-2):函数未能打开系统变量SRCDIR指定的输入文件。确保源文件有一个有效的文件名并且源文件和目标目录都存在。
COPY_ERR_OPENOUTPUT (-3):函数未能拷贝所要文件。
COPY_ERR_TARGETREADONLY (-46):TARGETDIR中的文件是只读文件。删除目标文件的只读属性并重试。
所有其它负值:表明发生一些其它不确定错误。
注解:
·如果你使用未限定文件名并在使用CopyFile时设置SRCDIR和 TARGETDIR的值,在调用CopyFile前用VarSave保存当前值并然后用VarRestore重新设置。如果目标目录不存在,CopyFile创建它。
·你不能通过调用CopyFile时使用通配符来重命名一组文件。然而,单独一个文件时你可以使用CopyFile来做到。
·为包括子目录,调用XcopyFile函数。
·对于文件传输,XCopyFile 是CopyFile的一个完美替换。XCopyFile可以做版本检测,标记锁定的.dll和.exe文件待系统重启后更新,并且递增共享的.dll和.exe文件的注册表访问计数器。
·因为Windows 95及更高版本不允许一个空文件被拷贝,Windows NT不允许创建空文件,CopyFile在这些平台下当被用来拷贝空文件(Size=0KB)时将不工作。
· 在用WriteProfString 或 WriteProfInt修改.ini文件后, Windows 95及更高版本下,你必须在使用CopyFile前刷新高速缓存。所有.ini文件在Windows 95及更高版本下被放在高速缓存中;这种特性可能导致延迟将修改写到指定文件。这接着可能妨碍随后的文件操作。为避免这个问题,简单地以空参数调用WriteProfString来强制Windows 95 及更高版本立即写数据到.ini文件,如下所示:
WriteProfString ("C://Test.ini", "Windows", "KeyboardDelay", "100");
file://null string ("") for all four parameters
WriteProfString ("", "", "", "");
file://CopyFile should now have access to updated file.
CopyFile ("C://Test.ini", "C://Temp//Test.ini");
对文件名更名
CFileException e;
if( !f.Open(fd, CFile::modeWrite|CFile::modeRead, &e )
...{
#ifdef _DEBUG
afxDump << "File could not be opened " << e.m_cause << " ";
#endif
}
f.Close();
try
...{
f.Rename(m_filearray[fnum].filename,m_filearray[fnum].status);
}
catch(CFileException* pEx )
...{
#ifdef _DEBUG
if(pEx->m_cause==CFileException::sharingViolation)
...{
MessageBox("the sharingViolation");
}
afxDump << "File " << m_filearray[fnum].filename << " not found, cause = "<< pEx->m_cause << " ";
#endif
pEx->Delete();
}
另用rename也能对文件和目录进行重命名。
目录管理:
BOOL CreateDirectory(
LPCTSTR lpPathName, // pointer to a directory path string
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
2。目录改名:
BOOL MoveFile(
LPCTSTR lpExistingFileName, // address of name of the existing file
LPCTSTR lpNewFileName // address of new name for the file
);
但MoveFile不能跨驱动器更改目录名。
BOOL DeleteDirectory(char *DirName)
...{
CFileFind tempFind;
char tempFileFind[200];
sprintf(tempFileFind,"%s/*.*",DirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
...{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
...{
char foundFileName[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory())
...{
char tempDir[200];
sprintf(tempDir,"%s/%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
...{
char tempFileName[200];
sprintf(tempFileName,"%s/%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemovwDirctory(DirName))
...{
MessageBox(0,"删除目录失败!","警告信息",MK_OK);
return FALSE;
}
return TRUE;
}
void DeleteDirectory(CString strDir)
...{
if(strDir.IsEmpty())
...{
RemoveDirectory(strDir);
return;
}
// 首先删除文件及子文件夹
CFileFind ff;
BOOL bFound = ff.FindFile(strDir+"/*", 0);
while(bFound)
...{
bFound = ff.FindNextFile();
if(ff.GetFileName()=="."||ff.GetFileName()=="..")
continue;
// 去掉文件(夹)只读等属性
SetFileAttributes(ff.GetFilePath(), FILE_ATTRIBUTE_NORMAL);
if(ff.IsDirectory())
...{ // 递归删除子文件夹
DeleteDirectory(ff.GetFilePath());
RemoveDirectory(ff.GetFilePath());
}
else ...{
DeleteFile(ff.GetFilePath()); // 删除文件
}
}
ff.Close();
// 然后删除该文件夹
RemoveDirectory(strDir);
}
int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);
- PC端文件及目录的管理总结
- 文件及目录管理
- linux下的文件及目录管理
- Linux文件及目录的管理
- POSIX文件及目录管理
- linux文件及目录管理
- POSIX文件及目录管理
- java 文件及目录管理
- POSIX文件及目录管理
- Linux文件及目录管理
- linux下的文件和目录管理自我总结
- 文件目录分析及文件管理命令
- Linux的文件权限与目录配置及文件与目录管理
- Linux文件与目录管理总结
- 文件及目录管理 POSIX C
- Linux文件管理及目录操作
- linux文件管理模式及目录管理操作
- linux文件及目录命令管理
- Windows 2003安全设置大全
- 可以使用30年的卡巴斯基
- 用RealPlayer查找影片准确地址
- java 生成 pdf excel
- 开机桌面不显示图标(桌面一片空白)的解决办法
- PC端文件及目录的管理总结
- 各种品牌笔记本电脑进BIOS的方法
- C++起点
- 网络协议之icmp
- C#实现远程控制
- OSO病毒查杀
- FOR ALL ENTRIES IN 影响速度(转贴-http://blog.vsharing.com/yangzg/ )
- Struts框架学习笔记
- 好用的eclipse打包.jar插件 fat_jar