asp.net实现文件夹遍历、文件大小统计等
最近在做了一个文件批量导入数据库的功能。一上午导了2000多张图片,很是过瘾,但还不满足,这里面应该还有很多待挖掘的东西.
比如如何获取一个文件夹下面的所有子文件和子目录,还统计整个文件夹所占的磁盘空间,我下面的代码不够只能智能,获取某个目录下面的子目录集合,只能手动加foreach实现,可否用一个foreache
protected void GetFileInfo()
{
List<mdl.Product> modelList = new List<mdl.Product>();
string rootPath = "Picture/Import";//根目录下面的文件夹名称
string mapPath = Server.MapPath("~/" + rootPath);
DirectoryInfo rootDir = new DirectoryInfo(mapPath);//获取文件夹Picture对象
DirectoryInfo[] dirs = rootDir.GetDirectories();////获取文件夹Picture下面的子文件夹对象集合
try
{
foreach (var subDir in dirs)//1、2、3、4、5、6文件夹(系列ID)
{
foreach (var itemFile in subDir.GetFiles())
{
mdl.Product model = new mdl.Product();
//图片名字作为数据表对象Title字段
model.CnTitle = itemFile.Name.Replace(".jpg", "").Replace(".JPG", "")+"#";
model.EnTitle = model.CnTitle;
model.TypeID = Convert.ToInt32(subDir.Name);//subDir.Name文件夹名称,即1、2、3、4、5、6
var pic = rootPath + "/" + subDir.Name + "/" + itemFile.Name;
//最终输出Picture/Import/1/2012-0912-334.jpgzhuru诸如此类的路径
model.PicA = pic;
model.PicB = pic;
// modelList.Add(model);//测试的时候用这个集合
DalProduct.Add(model);//插入数据库的方法
}
}
if (modelList.Count > 0)
{
lalExec.Text = "导入成功,共计: " + modelList.Count + " 条数据";
qwe1.DataSource = modelList;
qwe1.DataBind();
}
else
{
// lalExec.Text = "导入失败,数据为空";
}
}
catch (Exception ex)
{
lalExec.Text = "导入失败:" + ex.Message + "<br/>";
lalExec.Text += ex.InnerException + "<br/>";
lalExec.Text += ex.Source + "<br/>";
lalExec.Text += ex.StackTrace + "<br/>";
lalExec.Text += ex.TargetSite + "<br/>";
}
}
[解决办法]
遍历所有文件和子文件的文件?递归?
------解决方案--------------------
因为c#中获取目录使用GetDirectories()
但是获取文件使用GetFiles()
所以 LZ说的一个循环想要得到所以的目录以及目录下的文件 有点。。。
private List<FileTree> GetTreeData(string path, int parent = 0)
{
List<FileTree> treeList = new List<FileTree>();
DirectoryInfo dir = new DirectoryInfo(path);
//添加文件夹
foreach (DirectoryInfo directory in dir.GetDirectories())
{
treeList.Add(new FileTree
{
TreeID = treeid,
TreeParent = parent,
FileName = directory.Name,
FullPath = directory.FullName + "\\",
NodeType = "folder",
IconIndex = 0
});
treeList.AddRange(GetTreeData(directory.FullName, treeid++));
}
//添加文件
foreach (FileInfo file in dir.GetFiles())
{
treeList.Add(new FileTree
{
TreeID = treeid++,
TreeParent = parent,
FileName = file.Name,
FileSize = Convert.ToString(file.Length),
ModifyDate = file.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"),
FullPath = file.FullName,
NodeType = "file",
IconIndex = 1
});
}
return treeList;
}
我之前写的一个递归 放进一个树里面的 数据源,不知道LZ需不需要
[解决办法]
用ftp软件就可以了,还自己开发?
[解决办法]
private List<FileInfo> GetAllFileName(string path)
{
List<FileInfo> nameList = new List<FileInfo>();
DirectoryInfo rootDir = new DirectoryInfo(path);
foreach (FileInfo fileInfo in rootDir.GetFiles("*.txt"))
{
nameList.Add(fileInfo);
}
foreach (DirectoryInfo dir in rootDir.GetDirectories())
{
nameList.AddRange(GetAllFileName(dir.FullName));
}
return nameList;
}
这个是递归,给定一个目录可以返回该目录下所有子文件,包括所有子文件夹下的子文件,返回这些文件的对象。
[解决办法]
你的代码不做评论。只是提醒一点,对于大量的(或者你不确定是小量的)搜索,应该使用EnumerateDirectorie和EnumerateFiles,而不是GetDirectories和GetFiles。
[解决办法]
http://msdn.microsoft.com/zh-cn/library/ms143314(v=vs.80).aspx