下面有N个子文件夹
back1 back2 back3 back4 。。。
现在的任务是读取这些子文件
然后读子文件下的所有文件 、
得出最后修改时间(针对没一个子文件)
要用控制台 汗 、 谢谢大伙了
55 个解决方案
#1
对文件操作的类中好像有可以把一个目录中的所有文件名都返回的函数,返回值是数组型
找找看吧
找找看吧
#2
没看情,还有子文件,看来要用递归了
#3
这个就是递归啊,一层层找就行了
用控制台跟不用控制台没什么区别,看看MSDN的例子吧
// For Directory.GetFiles and Directory.GetDirectories
// For File.Exists, Directory.Exists
using System;
using System.IO;
using System.Collections;
public class RecursiveFileProcessor
{
public static void Main(string[] args)
{
foreach(string path in args)
{
if(File.Exists(path))
{
// This path is a file
ProcessFile(path);
}
else if(Directory.Exists(path))
{
// This path is a directory
ProcessDirectory(path);
}
else
{
Console.WriteLine("{0} is not a valid file or directory.", path);
}
}
}
// Process all files in the directory passed in, recurse on any directories
// that are found, and process the files they contain.
public static void ProcessDirectory(string targetDirectory)
{
// Process the list of files found in the directory.
string [] fileEntries = Directory.GetFiles(targetDirectory);
foreach(string fileName in fileEntries)
ProcessFile(fileName);
// Recurse into subdirectories of this directory.
string [] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
foreach(string subdirectory in subdirectoryEntries)
ProcessDirectory(subdirectory);
}
// Insert logic for processing found files here.
public static void ProcessFile(string path)
{
Console.WriteLine("Processed file '{0}'.", path);
}
}
用控制台跟不用控制台没什么区别,看看MSDN的例子吧
// For Directory.GetFiles and Directory.GetDirectories
// For File.Exists, Directory.Exists
using System;
using System.IO;
using System.Collections;
public class RecursiveFileProcessor
{
public static void Main(string[] args)
{
foreach(string path in args)
{
if(File.Exists(path))
{
// This path is a file
ProcessFile(path);
}
else if(Directory.Exists(path))
{
// This path is a directory
ProcessDirectory(path);
}
else
{
Console.WriteLine("{0} is not a valid file or directory.", path);
}
}
}
// Process all files in the directory passed in, recurse on any directories
// that are found, and process the files they contain.
public static void ProcessDirectory(string targetDirectory)
{
// Process the list of files found in the directory.
string [] fileEntries = Directory.GetFiles(targetDirectory);
foreach(string fileName in fileEntries)
ProcessFile(fileName);
// Recurse into subdirectories of this directory.
string [] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
foreach(string subdirectory in subdirectoryEntries)
ProcessDirectory(subdirectory);
}
// Insert logic for processing found files here.
public static void ProcessFile(string path)
{
Console.WriteLine("Processed file '{0}'.", path);
}
}
#4
static void Main(string[] args)
{
getFileLastAccessTime(@"D:\BBS");
Console.Read();
}
static void getFileLastAccessTime(string filePath)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
//DateTime.Compare( fileInfo.LastWriteTime,DateTime.Now);
Console.WriteLine(fileInfo.LastAccessTime);
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName); //递归
}
}
}
{
getFileLastAccessTime(@"D:\BBS");
Console.Read();
}
static void getFileLastAccessTime(string filePath)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
//DateTime.Compare( fileInfo.LastWriteTime,DateTime.Now);
Console.WriteLine(fileInfo.LastAccessTime);
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName); //递归
}
}
}
#5
是要得到这个子文件下所有的文件 然后得到这些文件的修改时间为最后修改的那个时间
#6
是读取 back1 ,back 2 。。。下所有文件 然后得到最后修改时间
按每个子文件来分的
#7
#8
给我顶起来
#9
static void Main(string[] args)
{
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
getFileLastAccessTime(@"D:\BBS", ref dic);
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
}
Console.Read();
}
static void getFileLastAccessTime(string filePath, ref Dictionary<string, DateTime> dic)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
if (dic.Keys.Contains(dirInfo.FullName))
{
if (dic[dirInfo.FullName] < fileInfo.LastAccessTime)
dic[dirInfo.FullName] = fileInfo.LastAccessTime;
else
continue;
}
else
{
dic.Add(dirInfo.FullName, fileInfo.LastAccessTime);
}
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName, ref dic); //递归
}
}
}
搞定。。。
{
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
getFileLastAccessTime(@"D:\BBS", ref dic);
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
}
Console.Read();
}
static void getFileLastAccessTime(string filePath, ref Dictionary<string, DateTime> dic)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
if (dic.Keys.Contains(dirInfo.FullName))
{
if (dic[dirInfo.FullName] < fileInfo.LastAccessTime)
dic[dirInfo.FullName] = fileInfo.LastAccessTime;
else
continue;
}
else
{
dic.Add(dirInfo.FullName, fileInfo.LastAccessTime);
}
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName, ref dic); //递归
}
}
}
搞定。。。
#10
真复杂,帮顶了
#11
不对 ,鉴定完毕。。。。
#12
你要什么效果??
#13
我要对子文件分别统计
也就是问题中提到的 back1,back2 。。。。
中的文件分别统计
而back1 什么的是首先分析 back 这个文件得到的
也就是说 我只知道back 这个文件的路径。 要分开统计他下一级的文件,并且得到最后修改的文件的日期
#14
现在的实现功能不就是分别对一个目录下,及子目录下文件进行分析,得到最后访问时间吗?如果需要的是最后修改时间只需要把LastAccessTime改成LastWriteTime即可。
#15
你的代码本身就有错误:static void getFileLastAccessTime(string filePath, ref Dictionary <string, DateTime> dic)
而且我是需要对子文件分别统计。 是分别哦 、
#16
是代码有错误,还是逻辑有错误,请描述清楚。
代码在我本机运行正常。
代码在我本机运行正常。
#17
代码错误。。。static void getFileLastWriteTime(string filePath, ref Dictionary<string, DateTime> dic) 这一句提示 找不到类型或者命名空间名称
我是菜鸟 。 所以请谅解
#18
if (dic.Keys.Contains(dirInfo.FullName))
{
if (dic[dirInfo.FullName] < fileInfo.LastWriteTime)
dic[dirInfo.FullName] = fileInfo.LastWriteTime;
else
continue;
}
不包含对 contains 的定义
{
if (dic[dirInfo.FullName] < fileInfo.LastWriteTime)
dic[dirInfo.FullName] = fileInfo.LastWriteTime;
else
continue;
}
不包含对 contains 的定义
#19
引入命名空间
using System.Collections.Generic;
你连我的代码都没有跑。就说功能没有实现。汗。。。。
using System.Collections.Generic;
你连我的代码都没有跑。就说功能没有实现。汗。。。。
#20
错误 1 “System.Collections.Generic.Dictionary<string,System.DateTime>.KeyCollection”并不包含“Contains”的定义 D:\Demo\GetFileInfo\ConsoleApplication1\ConsoleApplication1\Program.cs 35 30 ConsoleApplication1
#21
哦。那估计你用的是vs2005吧。不好意思。我这里用的是08.默认用了framework3.5
#22
想死了 。。。
#23
没关系。你稍微改一下就行了用
if (dic.ContainsKey(dirInfo.FullName))替换if (dic.Keys.Contains(dirInfo.FullName))
if (dic.ContainsKey(dirInfo.FullName))替换if (dic.Keys.Contains(dirInfo.FullName))
#24
可能是我表述错误!
我的意思是:
文件夹叫:serverbackup
里面有:host01,host02,host03 等等(不确定)
首先是要得到 serverbackup 的下一级 也就是 host01,host02,host03 等等
然后就要对 host01,host02 。。。分别统计(这里的host01,host02 。。。里的子级有多少都是未知的)
最后就是host01,host02 里得出最后写入时间 。
是host01 中文件的最后写入时间:xx-xx-xx
host02 xx-xx-xx
。。。。。。
我的意思是:
文件夹叫:serverbackup
里面有:host01,host02,host03 等等(不确定)
首先是要得到 serverbackup 的下一级 也就是 host01,host02,host03 等等
然后就要对 host01,host02 。。。分别统计(这里的host01,host02 。。。里的子级有多少都是未知的)
最后就是host01,host02 里得出最后写入时间 。
是host01 中文件的最后写入时间:xx-xx-xx
host02 xx-xx-xx
。。。。。。
#25
那我这里就是多了一级serverbackup文件下的文件时间。去掉就行了
#26
怎么去 多谢了 。
#27
还有个需求就是 得到最后写入时间后 , 往前推 20 天 然后计算 这期间创建文件的大小!
多谢你 你是个好人 。 分不够还可以加 但是我想你也不是冲着分来的
是人好 、
多谢你 你是个好人 。 分不够还可以加 但是我想你也不是冲着分来的
是人好 、
#28
我这里收集的信息都在dic里面
去掉不要的remove就行了。
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
}
去掉不要的remove就行了。
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
}
#29
host01的最后创建文件的时间是 2009-09-24, 往前推20天就是 2009-09-04
计算hsot01 下 这段时间(2009-09-04至2009-09-24)写入的文件的大小的和!
计算hsot01 下 这段时间(2009-09-04至2009-09-24)写入的文件的大小的和!
#30
好像还不可以呢 。
#31
我狂顶你
#32
我特地来帮你顶贴,以前有人问过这个问题。
2个函数 ,一个属性 递归
2个函数 ,一个属性 递归
#33
static void Main(string[] args)
{
string filePath = @"H:\back";
Program prg = new Program();
prg.ProcessFolder(filePath);
Console.Read();
}
public void ProcessFolder(string dir)
{
if (Directory.Exists(dir))
{
GetFileList(dir);
foreach (string d in Directory.GetFileSystemEntries(dir))
{
if (Directory.Exists(d))
{
ProcessFolder(d);
}
}
}
}
public void GetFileList(string dir)
{
string[] FileList = Directory.GetFiles(dir);
if (FileList.Length > 0)
{
Console.WriteLine("Folder:" + dir + ", File Count:" + FileList.Length);
Console.WriteLine("****************************************************************");
for (int i = 0; i < FileList.Length; i++)
{
GetFileLastWriteTime(i, FileList[i]);
}
}
}
public void GetFileLastWriteTime(int fileID,string filePath)
{
FileInfo fi = new FileInfo(filePath);
string dt=fi.LastWriteTime.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine("ID:" + fileID + "FileName:" + Path.GetFileName(filePath) + "DateTime:" + dt);
}
#34
这个 我 。 好像不对耶 。。。
#35
针对你后来提出的需求。增加了一个函数,调用示例:
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
Console.WriteLine(GetFileLength(s, dic[s]));
}
static long GetFileLength(string path, DateTime dt)
{
long result = 0L;
DirectoryInfo dirInfo = new DirectoryInfo(path);
FileInfo[] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
if (fileInfo.LastWriteTime > dt.AddDays(-20) && fileInfo.LastWriteTime < dt)
{
result += fileInfo.Length;
}
}
return result;
}
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
Console.WriteLine(GetFileLength(s, dic[s]));
}
static long GetFileLength(string path, DateTime dt)
{
long result = 0L;
DirectoryInfo dirInfo = new DirectoryInfo(path);
FileInfo[] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
if (fileInfo.LastWriteTime > dt.AddDays(-20) && fileInfo.LastWriteTime < dt)
{
result += fileInfo.Length;
}
}
return result;
}
#36
Program prg=new Program();這個改成你自己的Class名
#37
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace CTEST
{
class Program
{
static void Main(string[] args)
{
string filePath = @"H:\back";
Program prg = new Program();
prg.ProcessFolder(filePath);
Console.Read();
}
public void ProcessFolder(string dir)
{
if (Directory.Exists(dir))
{
GetFileList(dir);
foreach (string d in Directory.GetFileSystemEntries(dir))
{
if (Directory.Exists(d))
{
ProcessFolder(d);
}
}
}
}
public void GetFileList(string dir)
{
string[] FileList = Directory.GetFiles(dir);
if (FileList.Length > 0)
{
Console.WriteLine("Folder:" + dir + ", File Count:" + FileList.Length);
Console.WriteLine("****************************************************************");
for (int i = 0; i < FileList.Length; i++)
{
GetFileLastWriteTime(i, FileList[i]);
}
}
}
public void GetFileLastWriteTime(int fileID,string filePath)
{
FileInfo fi = new FileInfo(filePath);
string dt=fi.LastWriteTime.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine("ID:" + fileID + "FileName:" + Path.GetFileName(filePath) + "DateTime:" + dt);
}
}
}
#38
完整代码:
static void Main(string[] args)
{
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine("文件夹:"+s);
Console.WriteLine("文件夹下文件最后修改时间:"+dic[s]);
Console.WriteLine("20天期间增加文件大小:"+GetFileLength(s, dic[s]));
Console.WriteLine("---------------------------------------------------");
}
Console.Read();
}
static long GetFileLength(string path, DateTime dt)
{
long result = 0L;
DirectoryInfo dirInfo = new DirectoryInfo(path);
FileInfo[] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
if (fileInfo.LastWriteTime > dt.AddDays(-20) && fileInfo.LastWriteTime < dt)
{
result += fileInfo.Length;
}
}
return result;
}
static void getFileLastAccessTime(string filePath, ref Dictionary<string, DateTime> dic)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
if (dic.ContainsKey(dirInfo.FullName))
{
if (dic[dirInfo.FullName] < fileInfo.LastWriteTime)
dic[dirInfo.FullName] = fileInfo.LastWriteTime;
else
continue;
}
else
{
dic.Add(dirInfo.FullName, fileInfo.LastWriteTime);
}
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName, ref dic); //递归
}
}
}
static void Main(string[] args)
{
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine("文件夹:"+s);
Console.WriteLine("文件夹下文件最后修改时间:"+dic[s]);
Console.WriteLine("20天期间增加文件大小:"+GetFileLength(s, dic[s]));
Console.WriteLine("---------------------------------------------------");
}
Console.Read();
}
static long GetFileLength(string path, DateTime dt)
{
long result = 0L;
DirectoryInfo dirInfo = new DirectoryInfo(path);
FileInfo[] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
if (fileInfo.LastWriteTime > dt.AddDays(-20) && fileInfo.LastWriteTime < dt)
{
result += fileInfo.Length;
}
}
return result;
}
static void getFileLastAccessTime(string filePath, ref Dictionary<string, DateTime> dic)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
if (dic.ContainsKey(dirInfo.FullName))
{
if (dic[dirInfo.FullName] < fileInfo.LastWriteTime)
dic[dirInfo.FullName] = fileInfo.LastWriteTime;
else
continue;
}
else
{
dic.Add(dirInfo.FullName, fileInfo.LastWriteTime);
}
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName, ref dic); //递归
}
}
}
#39
我的表述能力有这么差么 、 汗 。。。
只要得到 host01 下最新写入的文件的时间
其他都不管 。
host01 下 不管他有多少文件数 。 只取最后写入的那个文件 他的时间。
只要得到 host01 下最新写入的文件的时间
其他都不管 。
host01 下 不管他有多少文件数 。 只取最后写入的那个文件 他的时间。
#40
有点接近了,但是还是没去掉子目录!
只需要第一级 也就是 host01 那一级!
#41
也就是host01里面所有的文件中 最后写的那个时间 。
其他的文件夹不需要列出来 、
#42
其实,不需使用递归。
过程:
1、取出指目录下的子目录列表。
2、循环对单个目录处理,找出这个目录下的所有文件(取目录下文件有个属性,是否包括子目录),比较找出最后的操作时间即可。
稍后给出完整代码。。
过程:
1、取出指目录下的子目录列表。
2、循环对单个目录处理,找出这个目录下的所有文件(取目录下文件有个属性,是否包括子目录),比较找出最后的操作时间即可。
稍后给出完整代码。。
#43
只需要第一级。那就不需要递归了。把目录后面的代码去掉
#44
那你直接传d:\back\host01不就行了
#45
期待中,也就您理解了我的意思!
#46
完整代码如下,在vs2005下测试通过:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace test111
{
class Program
{
static void Main(string[] args)
{
string bootDir = @"F:\开发工具"; // 改成自己需要的目录
string[] subDir = Directory.GetDirectories(bootDir);
DateTime maxdtfile;
string maxfilename = "";
string[] filelist;
FileInfo fi;
foreach (string dir1 in subDir)
{
maxdtfile = new DateTime(1900, 1, 1);
filelist = Directory.GetFiles(dir1, "*.*", SearchOption.AllDirectories);
foreach (string filename in filelist)
{
fi = new FileInfo(filename);
if (fi.LastWriteTime > maxdtfile)
{
maxdtfile = fi.LastWriteTime; // 最近的时间
maxfilename = filename; // 最近时间的文件
}
}
Console.WriteLine(string.Format("目录:{0}下最近的日期为:{1},文件为:{2}", dir1, maxdtfile, maxfilename));
}
Console.ReadLine();
}
}
}
#47
您误会了.我的意思是 host01 这些文件是不确定的
只知道他的上级文件是 serverbackup
我统计是针对 host01 而言的 也就是他下面的所有的文件 取最新写入的那个
当然每个serverbackup下一级的都会是这样的(host02 , 03 , 04 )
不知道这下有没说清楚 ...
#48
可能效率不是最高的,但可以满足LZ的要求。
只管了功能的实现。
只管了功能的实现。
#49
貌似就是这样 呵呵 多谢了 ... 但是还有需求没完成 呵呵
加把劲 多谢拉 . 那就是最新时间 往前推20天 然后求最新时间和前20天时间内创建的文件的总大小
嗯 就是这样了 ! 多谢多谢多谢多谢多谢多谢多谢
#50
要求出最新时间和前20天时间内创建的文件的总大小,只需在原代码上做相应修改即可。
框架的代码已经出来了,就加点小功能完善而已。
框架的代码已经出来了,就加点小功能完善而已。
#1
对文件操作的类中好像有可以把一个目录中的所有文件名都返回的函数,返回值是数组型
找找看吧
找找看吧
#2
没看情,还有子文件,看来要用递归了
#3
这个就是递归啊,一层层找就行了
用控制台跟不用控制台没什么区别,看看MSDN的例子吧
// For Directory.GetFiles and Directory.GetDirectories
// For File.Exists, Directory.Exists
using System;
using System.IO;
using System.Collections;
public class RecursiveFileProcessor
{
public static void Main(string[] args)
{
foreach(string path in args)
{
if(File.Exists(path))
{
// This path is a file
ProcessFile(path);
}
else if(Directory.Exists(path))
{
// This path is a directory
ProcessDirectory(path);
}
else
{
Console.WriteLine("{0} is not a valid file or directory.", path);
}
}
}
// Process all files in the directory passed in, recurse on any directories
// that are found, and process the files they contain.
public static void ProcessDirectory(string targetDirectory)
{
// Process the list of files found in the directory.
string [] fileEntries = Directory.GetFiles(targetDirectory);
foreach(string fileName in fileEntries)
ProcessFile(fileName);
// Recurse into subdirectories of this directory.
string [] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
foreach(string subdirectory in subdirectoryEntries)
ProcessDirectory(subdirectory);
}
// Insert logic for processing found files here.
public static void ProcessFile(string path)
{
Console.WriteLine("Processed file '{0}'.", path);
}
}
用控制台跟不用控制台没什么区别,看看MSDN的例子吧
// For Directory.GetFiles and Directory.GetDirectories
// For File.Exists, Directory.Exists
using System;
using System.IO;
using System.Collections;
public class RecursiveFileProcessor
{
public static void Main(string[] args)
{
foreach(string path in args)
{
if(File.Exists(path))
{
// This path is a file
ProcessFile(path);
}
else if(Directory.Exists(path))
{
// This path is a directory
ProcessDirectory(path);
}
else
{
Console.WriteLine("{0} is not a valid file or directory.", path);
}
}
}
// Process all files in the directory passed in, recurse on any directories
// that are found, and process the files they contain.
public static void ProcessDirectory(string targetDirectory)
{
// Process the list of files found in the directory.
string [] fileEntries = Directory.GetFiles(targetDirectory);
foreach(string fileName in fileEntries)
ProcessFile(fileName);
// Recurse into subdirectories of this directory.
string [] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
foreach(string subdirectory in subdirectoryEntries)
ProcessDirectory(subdirectory);
}
// Insert logic for processing found files here.
public static void ProcessFile(string path)
{
Console.WriteLine("Processed file '{0}'.", path);
}
}
#4
static void Main(string[] args)
{
getFileLastAccessTime(@"D:\BBS");
Console.Read();
}
static void getFileLastAccessTime(string filePath)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
//DateTime.Compare( fileInfo.LastWriteTime,DateTime.Now);
Console.WriteLine(fileInfo.LastAccessTime);
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName); //递归
}
}
}
{
getFileLastAccessTime(@"D:\BBS");
Console.Read();
}
static void getFileLastAccessTime(string filePath)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
//DateTime.Compare( fileInfo.LastWriteTime,DateTime.Now);
Console.WriteLine(fileInfo.LastAccessTime);
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName); //递归
}
}
}
#5
是要得到这个子文件下所有的文件 然后得到这些文件的修改时间为最后修改的那个时间
#6
是读取 back1 ,back 2 。。。下所有文件 然后得到最后修改时间
按每个子文件来分的
#7
#8
给我顶起来
#9
static void Main(string[] args)
{
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
getFileLastAccessTime(@"D:\BBS", ref dic);
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
}
Console.Read();
}
static void getFileLastAccessTime(string filePath, ref Dictionary<string, DateTime> dic)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
if (dic.Keys.Contains(dirInfo.FullName))
{
if (dic[dirInfo.FullName] < fileInfo.LastAccessTime)
dic[dirInfo.FullName] = fileInfo.LastAccessTime;
else
continue;
}
else
{
dic.Add(dirInfo.FullName, fileInfo.LastAccessTime);
}
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName, ref dic); //递归
}
}
}
搞定。。。
{
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
getFileLastAccessTime(@"D:\BBS", ref dic);
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
}
Console.Read();
}
static void getFileLastAccessTime(string filePath, ref Dictionary<string, DateTime> dic)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
if (dic.Keys.Contains(dirInfo.FullName))
{
if (dic[dirInfo.FullName] < fileInfo.LastAccessTime)
dic[dirInfo.FullName] = fileInfo.LastAccessTime;
else
continue;
}
else
{
dic.Add(dirInfo.FullName, fileInfo.LastAccessTime);
}
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName, ref dic); //递归
}
}
}
搞定。。。
#10
真复杂,帮顶了
#11
不对 ,鉴定完毕。。。。
#12
你要什么效果??
#13
我要对子文件分别统计
也就是问题中提到的 back1,back2 。。。。
中的文件分别统计
而back1 什么的是首先分析 back 这个文件得到的
也就是说 我只知道back 这个文件的路径。 要分开统计他下一级的文件,并且得到最后修改的文件的日期
#14
现在的实现功能不就是分别对一个目录下,及子目录下文件进行分析,得到最后访问时间吗?如果需要的是最后修改时间只需要把LastAccessTime改成LastWriteTime即可。
#15
你的代码本身就有错误:static void getFileLastAccessTime(string filePath, ref Dictionary <string, DateTime> dic)
而且我是需要对子文件分别统计。 是分别哦 、
#16
是代码有错误,还是逻辑有错误,请描述清楚。
代码在我本机运行正常。
代码在我本机运行正常。
#17
代码错误。。。static void getFileLastWriteTime(string filePath, ref Dictionary<string, DateTime> dic) 这一句提示 找不到类型或者命名空间名称
我是菜鸟 。 所以请谅解
#18
if (dic.Keys.Contains(dirInfo.FullName))
{
if (dic[dirInfo.FullName] < fileInfo.LastWriteTime)
dic[dirInfo.FullName] = fileInfo.LastWriteTime;
else
continue;
}
不包含对 contains 的定义
{
if (dic[dirInfo.FullName] < fileInfo.LastWriteTime)
dic[dirInfo.FullName] = fileInfo.LastWriteTime;
else
continue;
}
不包含对 contains 的定义
#19
引入命名空间
using System.Collections.Generic;
你连我的代码都没有跑。就说功能没有实现。汗。。。。
using System.Collections.Generic;
你连我的代码都没有跑。就说功能没有实现。汗。。。。
#20
错误 1 “System.Collections.Generic.Dictionary<string,System.DateTime>.KeyCollection”并不包含“Contains”的定义 D:\Demo\GetFileInfo\ConsoleApplication1\ConsoleApplication1\Program.cs 35 30 ConsoleApplication1
#21
哦。那估计你用的是vs2005吧。不好意思。我这里用的是08.默认用了framework3.5
#22
想死了 。。。
#23
没关系。你稍微改一下就行了用
if (dic.ContainsKey(dirInfo.FullName))替换if (dic.Keys.Contains(dirInfo.FullName))
if (dic.ContainsKey(dirInfo.FullName))替换if (dic.Keys.Contains(dirInfo.FullName))
#24
可能是我表述错误!
我的意思是:
文件夹叫:serverbackup
里面有:host01,host02,host03 等等(不确定)
首先是要得到 serverbackup 的下一级 也就是 host01,host02,host03 等等
然后就要对 host01,host02 。。。分别统计(这里的host01,host02 。。。里的子级有多少都是未知的)
最后就是host01,host02 里得出最后写入时间 。
是host01 中文件的最后写入时间:xx-xx-xx
host02 xx-xx-xx
。。。。。。
我的意思是:
文件夹叫:serverbackup
里面有:host01,host02,host03 等等(不确定)
首先是要得到 serverbackup 的下一级 也就是 host01,host02,host03 等等
然后就要对 host01,host02 。。。分别统计(这里的host01,host02 。。。里的子级有多少都是未知的)
最后就是host01,host02 里得出最后写入时间 。
是host01 中文件的最后写入时间:xx-xx-xx
host02 xx-xx-xx
。。。。。。
#25
那我这里就是多了一级serverbackup文件下的文件时间。去掉就行了
#26
怎么去 多谢了 。
#27
还有个需求就是 得到最后写入时间后 , 往前推 20 天 然后计算 这期间创建文件的大小!
多谢你 你是个好人 。 分不够还可以加 但是我想你也不是冲着分来的
是人好 、
多谢你 你是个好人 。 分不够还可以加 但是我想你也不是冲着分来的
是人好 、
#28
我这里收集的信息都在dic里面
去掉不要的remove就行了。
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
}
去掉不要的remove就行了。
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
}
#29
host01的最后创建文件的时间是 2009-09-24, 往前推20天就是 2009-09-04
计算hsot01 下 这段时间(2009-09-04至2009-09-24)写入的文件的大小的和!
计算hsot01 下 这段时间(2009-09-04至2009-09-24)写入的文件的大小的和!
#30
好像还不可以呢 。
#31
我狂顶你
#32
我特地来帮你顶贴,以前有人问过这个问题。
2个函数 ,一个属性 递归
2个函数 ,一个属性 递归
#33
static void Main(string[] args)
{
string filePath = @"H:\back";
Program prg = new Program();
prg.ProcessFolder(filePath);
Console.Read();
}
public void ProcessFolder(string dir)
{
if (Directory.Exists(dir))
{
GetFileList(dir);
foreach (string d in Directory.GetFileSystemEntries(dir))
{
if (Directory.Exists(d))
{
ProcessFolder(d);
}
}
}
}
public void GetFileList(string dir)
{
string[] FileList = Directory.GetFiles(dir);
if (FileList.Length > 0)
{
Console.WriteLine("Folder:" + dir + ", File Count:" + FileList.Length);
Console.WriteLine("****************************************************************");
for (int i = 0; i < FileList.Length; i++)
{
GetFileLastWriteTime(i, FileList[i]);
}
}
}
public void GetFileLastWriteTime(int fileID,string filePath)
{
FileInfo fi = new FileInfo(filePath);
string dt=fi.LastWriteTime.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine("ID:" + fileID + "FileName:" + Path.GetFileName(filePath) + "DateTime:" + dt);
}
#34
这个 我 。 好像不对耶 。。。
#35
针对你后来提出的需求。增加了一个函数,调用示例:
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
Console.WriteLine(GetFileLength(s, dic[s]));
}
static long GetFileLength(string path, DateTime dt)
{
long result = 0L;
DirectoryInfo dirInfo = new DirectoryInfo(path);
FileInfo[] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
if (fileInfo.LastWriteTime > dt.AddDays(-20) && fileInfo.LastWriteTime < dt)
{
result += fileInfo.Length;
}
}
return result;
}
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine(s);
Console.WriteLine(dic[s]);
Console.WriteLine(GetFileLength(s, dic[s]));
}
static long GetFileLength(string path, DateTime dt)
{
long result = 0L;
DirectoryInfo dirInfo = new DirectoryInfo(path);
FileInfo[] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
if (fileInfo.LastWriteTime > dt.AddDays(-20) && fileInfo.LastWriteTime < dt)
{
result += fileInfo.Length;
}
}
return result;
}
#36
Program prg=new Program();這個改成你自己的Class名
#37
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace CTEST
{
class Program
{
static void Main(string[] args)
{
string filePath = @"H:\back";
Program prg = new Program();
prg.ProcessFolder(filePath);
Console.Read();
}
public void ProcessFolder(string dir)
{
if (Directory.Exists(dir))
{
GetFileList(dir);
foreach (string d in Directory.GetFileSystemEntries(dir))
{
if (Directory.Exists(d))
{
ProcessFolder(d);
}
}
}
}
public void GetFileList(string dir)
{
string[] FileList = Directory.GetFiles(dir);
if (FileList.Length > 0)
{
Console.WriteLine("Folder:" + dir + ", File Count:" + FileList.Length);
Console.WriteLine("****************************************************************");
for (int i = 0; i < FileList.Length; i++)
{
GetFileLastWriteTime(i, FileList[i]);
}
}
}
public void GetFileLastWriteTime(int fileID,string filePath)
{
FileInfo fi = new FileInfo(filePath);
string dt=fi.LastWriteTime.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine("ID:" + fileID + "FileName:" + Path.GetFileName(filePath) + "DateTime:" + dt);
}
}
}
#38
完整代码:
static void Main(string[] args)
{
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine("文件夹:"+s);
Console.WriteLine("文件夹下文件最后修改时间:"+dic[s]);
Console.WriteLine("20天期间增加文件大小:"+GetFileLength(s, dic[s]));
Console.WriteLine("---------------------------------------------------");
}
Console.Read();
}
static long GetFileLength(string path, DateTime dt)
{
long result = 0L;
DirectoryInfo dirInfo = new DirectoryInfo(path);
FileInfo[] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
if (fileInfo.LastWriteTime > dt.AddDays(-20) && fileInfo.LastWriteTime < dt)
{
result += fileInfo.Length;
}
}
return result;
}
static void getFileLastAccessTime(string filePath, ref Dictionary<string, DateTime> dic)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
if (dic.ContainsKey(dirInfo.FullName))
{
if (dic[dirInfo.FullName] < fileInfo.LastWriteTime)
dic[dirInfo.FullName] = fileInfo.LastWriteTime;
else
continue;
}
else
{
dic.Add(dirInfo.FullName, fileInfo.LastWriteTime);
}
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName, ref dic); //递归
}
}
}
static void Main(string[] args)
{
Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
FileOp.getFileLastAccessTime(@"D:\BBS", ref dic);
if (dic.ContainsKey(@"D:\BBS"))
dic.Remove(@"D:\BBS");
foreach (string s in dic.Keys)
{
Console.WriteLine("文件夹:"+s);
Console.WriteLine("文件夹下文件最后修改时间:"+dic[s]);
Console.WriteLine("20天期间增加文件大小:"+GetFileLength(s, dic[s]));
Console.WriteLine("---------------------------------------------------");
}
Console.Read();
}
static long GetFileLength(string path, DateTime dt)
{
long result = 0L;
DirectoryInfo dirInfo = new DirectoryInfo(path);
FileInfo[] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
if (fileInfo.LastWriteTime > dt.AddDays(-20) && fileInfo.LastWriteTime < dt)
{
result += fileInfo.Length;
}
}
return result;
}
static void getFileLastAccessTime(string filePath, ref Dictionary<string, DateTime> dic)
{
if (string.IsNullOrEmpty(filePath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
FileInfo[] fileInfos = dirInfo.GetFiles();
//文件
foreach (FileInfo fileInfo in fileInfos)
{
if (dic.ContainsKey(dirInfo.FullName))
{
if (dic[dirInfo.FullName] < fileInfo.LastWriteTime)
dic[dirInfo.FullName] = fileInfo.LastWriteTime;
else
continue;
}
else
{
dic.Add(dirInfo.FullName, fileInfo.LastWriteTime);
}
}
//目录
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
getFileLastAccessTime(childDirInfo.FullName, ref dic); //递归
}
}
}
#39
我的表述能力有这么差么 、 汗 。。。
只要得到 host01 下最新写入的文件的时间
其他都不管 。
host01 下 不管他有多少文件数 。 只取最后写入的那个文件 他的时间。
只要得到 host01 下最新写入的文件的时间
其他都不管 。
host01 下 不管他有多少文件数 。 只取最后写入的那个文件 他的时间。
#40
有点接近了,但是还是没去掉子目录!
只需要第一级 也就是 host01 那一级!
#41
也就是host01里面所有的文件中 最后写的那个时间 。
其他的文件夹不需要列出来 、
#42
其实,不需使用递归。
过程:
1、取出指目录下的子目录列表。
2、循环对单个目录处理,找出这个目录下的所有文件(取目录下文件有个属性,是否包括子目录),比较找出最后的操作时间即可。
稍后给出完整代码。。
过程:
1、取出指目录下的子目录列表。
2、循环对单个目录处理,找出这个目录下的所有文件(取目录下文件有个属性,是否包括子目录),比较找出最后的操作时间即可。
稍后给出完整代码。。
#43
只需要第一级。那就不需要递归了。把目录后面的代码去掉
#44
那你直接传d:\back\host01不就行了
#45
期待中,也就您理解了我的意思!
#46
完整代码如下,在vs2005下测试通过:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace test111
{
class Program
{
static void Main(string[] args)
{
string bootDir = @"F:\开发工具"; // 改成自己需要的目录
string[] subDir = Directory.GetDirectories(bootDir);
DateTime maxdtfile;
string maxfilename = "";
string[] filelist;
FileInfo fi;
foreach (string dir1 in subDir)
{
maxdtfile = new DateTime(1900, 1, 1);
filelist = Directory.GetFiles(dir1, "*.*", SearchOption.AllDirectories);
foreach (string filename in filelist)
{
fi = new FileInfo(filename);
if (fi.LastWriteTime > maxdtfile)
{
maxdtfile = fi.LastWriteTime; // 最近的时间
maxfilename = filename; // 最近时间的文件
}
}
Console.WriteLine(string.Format("目录:{0}下最近的日期为:{1},文件为:{2}", dir1, maxdtfile, maxfilename));
}
Console.ReadLine();
}
}
}
#47
您误会了.我的意思是 host01 这些文件是不确定的
只知道他的上级文件是 serverbackup
我统计是针对 host01 而言的 也就是他下面的所有的文件 取最新写入的那个
当然每个serverbackup下一级的都会是这样的(host02 , 03 , 04 )
不知道这下有没说清楚 ...
#48
可能效率不是最高的,但可以满足LZ的要求。
只管了功能的实现。
只管了功能的实现。
#49
貌似就是这样 呵呵 多谢了 ... 但是还有需求没完成 呵呵
加把劲 多谢拉 . 那就是最新时间 往前推20天 然后求最新时间和前20天时间内创建的文件的总大小
嗯 就是这样了 ! 多谢多谢多谢多谢多谢多谢多谢
#50
要求出最新时间和前20天时间内创建的文件的总大小,只需在原代码上做相应修改即可。
框架的代码已经出来了,就加点小功能完善而已。
框架的代码已经出来了,就加点小功能完善而已。