今天对自己以前写的一些常用的组件整理了一下,发现对文件目录的操作的一个类还用的比较多,于是对他进行了修改,一些方法是为在社区中看到有网友提问增加的,包括复制目录的文件和子目录,移动目录文件和子目录,生成xml树形文件等。
using system;
using system.io;
using system.xml;
namespace zhzuo
{
/// <summary>
/// filedirectoryutility 类,方法不包含异常处理
/// </summary>
public class filedirectoryutility
{
/// <summary>
/// 路径分割符
/// </summary>
private const string path_split_char = "\\";
/// <summary>
/// 构造函数
/// </summary>
private filedirectoryutility()
{
}
/// <summary>
/// 复制指定目录的所有文件,不包含子目录及子目录中的文件
/// </summary>
/// <param name="sourcedir">原始目录</param>
/// <param name="targetdir">目标目录</param>
/// <param name="overwrite">如果为true,表示覆盖同名文件,否则不覆盖</param>
public static void copyfiles(string sourcedir,string targetdir,bool overwrite)
{
copyfiles(sourcedir,targetdir,overwrite,false);
}
/// <summary>
/// 复制指定目录的所有文件
/// </summary>
/// <param name="sourcedir">原始目录</param>
/// <param name="targetdir">目标目录</param>
/// <param name="overwrite">如果为true,覆盖同名文件,否则不覆盖</param>
/// <param name="copysubdir">如果为true,包含目录,否则不包含</param>
public static void copyfiles(string sourcedir,string targetdir,bool overwrite,bool copysubdir)
{
//复制当前目录文件
foreach(string sourcefilename in directory.getfiles(sourcedir))
{
string targetfilename = path.combine(targetdir,sourcefilename.substring(sourcefilename.lastindexof(path_split_char)+ 1));
if(file.exists(targetfilename))
{
if(overwrite == true)
{
file.setattributes(targetfilename,fileattributes.normal);
file.copy(sourcefilename,targetfilename,overwrite);
}
}
else
{
file.copy(sourcefilename,targetfilename,overwrite);
}
}
//复制子目录
if(copysubdir)
{
foreach(string sourcesubdir in directory.getdirectories(sourcedir))
{
string targetsubdir = path.combine(targetdir,sourcesubdir.substring(sourcesubdir.lastindexof(path_split_char) +1));
if(!directory.exists(targetsubdir))
directory.createdirectory(targetsubdir);
copyfiles(sourcesubdir,targetsubdir,overwrite,true);
}
}
}
/// <summary>
/// 剪切指定目录的所有文件,不包含子目录
/// </summary>
/// <param name="sourcedir">原始目录</param>
/// <param name="targetdir">目标目录</param>
/// <param name="overwrite">如果为true,覆盖同名文件,否则不覆盖</param>
public static void movefiles(string sourcedir,string targetdir,bool overwrite)
{
movefiles(sourcedir,targetdir,overwrite,false);
}
/// <summary>
/// 剪切指定目录的所有文件
/// </summary>
/// <param name="sourcedir">原始目录</param>
/// <param name="targetdir">目标目录</param>
/// <param name="overwrite">如果为true,覆盖同名文件,否则不覆盖</param>
/// <param name="movesubdir">如果为true,包含目录,否则不包含</param>
public static void movefiles(string sourcedir,string targetdir,bool overwrite,bool movesubdir)
{
//移动当前目录文件
foreach(string sourcefilename in directory.getfiles(sourcedir))
{
string targetfilename = path.combine(targetdir ,sourcefilename.substring(sourcefilename.lastindexof(path_split_char) + 1));
if(file.exists(targetfilename))
{
if(overwrite == true)
{
file.setattributes(targetfilename,fileattributes.normal);
file.delete(targetfilename);
file.move(sourcefilename,targetfilename);
}
}
else
{
file.move(sourcefilename,targetfilename);
}
}
if(movesubdir)
{
foreach(string sourcesubdir in directory.getdirectories(sourcedir))
{
string targetsubdir = path.combine(targetdir ,sourcesubdir.substring(sourcesubdir.lastindexof(path_split_char) + 1));
if(!directory.exists(targetsubdir))
directory.createdirectory(targetsubdir);
movefiles(sourcesubdir,targetsubdir,overwrite,true);
directory.delete(sourcesubdir);
}
}
}
/// <summary>
/// 删除指定目录的所有文件,不包含子目录
/// </summary>
/// <param name="targetdir">操作目录</param>
public static void deletefiles(string targetdir)
{
deletefiles(targetdir,false);
}
/// <summary>
/// 删除指定目录的所有文件和子目录
/// </summary>
/// <param name="targetdir">操作目录</param>
/// <param name="delsubdir">如果为true,包含对子目录的操作</param>
public static void deletefiles(string targetdir,bool delsubdir)
{
foreach(string filename in directory.getfiles(targetdir))
{
file.setattributes(filename,fileattributes.normal);
file.delete(filename);
}
if(delsubdir)
{
directoryinfo dir = new directoryinfo(targetdir);
foreach(directoryinfo subdi in dir.getdirectories())
{
deletefiles(subdi.fullname,true);
subdi.delete();
}
}
}
/// <summary>
/// 创建指定目录
/// </summary>
/// <param name="targetdir"></param>
public static void createdirectory(string targetdir)
{
directoryinfo dir= new directoryinfo(targetdir);
if (!dir.exists)
dir.create();
}
/// <summary>
/// 建立子目录
/// </summary>
/// <param name="targetdir">目录路径</param>
/// <param name="subdirname">子目录名称</param>
public static void createdirectory(string parentdir,string subdirname)
{
createdirectory(parentdir + path_split_char + subdirname);
}
/// <summary>
/// 删除指定目录
/// </summary>
/// <param name="targetdir">目录路径</param>
public static void deletedirectory(string targetdir)
{
directoryinfo dirinfo = new directoryinfo(targetdir);
if(dirinfo.exists)
{
deletefiles(targetdir,true);
dirinfo.delete(true);
}
}
/// <summary>
/// 删除指定目录的所有子目录,不包括对当前目录文件的删除
/// </summary>
/// <param name="targetdir">目录路径</param>
public static void deletesubdirectory(string targetdir)
{
foreach(string subdir in directory.getdirectories(targetdir))
{
deletedirectory(subdir);
}
}
/// <summary>
/// 将指定目录下的子目录和文件生成xml文档
/// </summary>
/// <param name="targetdir">根目录</param>
/// <returns>返回xmldocument对象</returns>
public static xmldocument createxml(string targetdir)
{
xmldocument mydocument = new xmldocument();
xmldeclaration declaration = mydocument.createxmldeclaration("1.0","utf-8",null);
mydocument.appendchild(declaration);
xmlelement rootelement = mydocument.createelement(targetdir.substring(targetdir.lastindexof(path_split_char) + 1));
mydocument.appendchild(rootelement);
foreach(string filename in directory.getfiles(targetdir))
{
xmlelement childelement = mydocument.createelement("file");
childelement.innertext = filename.substring(filename.lastindexof(path_split_char) + 1);
rootelement.appendchild(childelement);
}
foreach(string directory in directory.getdirectories(targetdir))
{
xmlelement childelement = mydocument.createelement("directory");
childelement.setattribute("name",directory.substring(directory.lastindexof(path_split_char) + 1));
rootelement.appendchild(childelement);
createbranch(directory,childelement,mydocument);
}
return mydocument;
}
/// <summary>
/// 生成xml分支
/// </summary>
/// <param name="targetdir">子目录</param>
/// <param name="xmlnode">父目录xmldocument</param>
/// <param name="mydocument">xmldocument对象</param>
private static void createbranch(string targetdir,xmlelement xmlnode,xmldocument mydocument)
{
foreach(string filename in directory.getfiles(targetdir))
{
xmlelement childelement = mydocument.createelement("file");
childelement.innertext = filename.substring(filename.lastindexof(path_split_char)+1);
xmlnode.appendchild(childelement);
}
foreach(string directory in directory.getdirectories(targetdir))
{
xmlelement childelement = mydocument.createelement("directory");
childelement.setattribute("name",directory.substring(directory.lastindexof(path_split_char) + 1));
xmlnode.appendchild(childelement);
createbranch(directory,childelement,mydocument);
}
}
}
}
整个类比较简单,没有写相关的查找文件目录的方法;对异常没有处理,我认为如果有异常抛出还是在这个类外面处理更好。如果有网友使用,发现问题请联系我,或在blog上留言。另外,在测试这个类的时候,发现了一个bug,不知道是 windows系统的 bug和.net framework1.1的bug。
