C# 文件按时间分组

didiaogao 2010-11-15 09:02:05
比如说我会1秒钟往一个文件夹里生成5张图片,但是有时候1秒钟生成不够5张,我就想根据时间判断如果不够5张得话。就复制其中一张来填充。

所以我想根据时间来分下组,因为有5张的时间是一样的。所以可以根据时间来判断哪秒 不够5张,怎么实现



详细一点。有源码最好。谢啦
...全文
188 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
didiaogao 2010-11-25
  • 打赏
  • 举报
回复
继续在线等
didiaogao 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bclz_vs 的回复:]
引用 13 楼 didiaogao 的回复:

引用 5 楼 bclz_vs 的回复:
GetAllFileInfos(String path)
这个方法楼主自己能实现吧


你给我的那段代码createdTime 和secons 没有定义??

刚才我没编译过,来个能编译通过的。

C# code

public class FileInfoCount
{
……
[/Quote]

这个我试了 好像不太满足我的要求啊。还是说是我理解有问题
didiaogao 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wuyazhe 的回复:]
引用 18 楼 bclz_vs 的回复:
group fi by fi.CreationTime不 过这个应该改成group fi by fi.CreationTime.TotalSeconds吧

没实际测试过,没尝试1秒创建5张图片,效果一样吧。时间会做对比,TotalSeconds一致的,时间也应该是一样的。
[/Quote]

我们不能用vs2008啊。。linq 也用不了啊。。郁闷
兔子-顾问 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 bclz_vs 的回复:]
group fi by fi.CreationTime不 过这个应该改成group fi by fi.CreationTime.TotalSeconds吧
[/Quote]
没实际测试过,没尝试1秒创建5张图片,效果一样吧。时间会做对比,TotalSeconds一致的,时间也应该是一样的。
边城的刀声 2010-11-15
  • 打赏
  • 举报
回复
group fi by fi.CreationTime不 过这个应该改成group fi by fi.CreationTime.TotalSeconds吧
边城的刀声 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wuyazhe 的回复:]

如果遍历目录
C# code

DirectoryInfo di = new DirectoryInfo(@"c:\");
var lessGroup = from fi in di.GetFiles("*.jpg") group fi by fi.CreationTime into g where g.Count() < 5 select g;
//lessGroup就是不足5个的,考虑多……
[/Quote]
这是linq? 太强大了,顶
flyerwing 2010-11-15
  • 打赏
  • 举报
回复
又是这个帖子不是都搞过了吗.
兔子-顾问 2010-11-15
  • 打赏
  • 举报
回复
如果遍历目录

DirectoryInfo di = new DirectoryInfo(@"c:\");
var lessGroup = from fi in di.GetFiles("*.jpg") group fi by fi.CreationTime into g where g.Count() < 5 select g;
//lessGroup就是不足5个的,考虑多组不足5个的情况
foreach (var g in lessGroup)
{
foreach (var item in g)
{
//item//就是FileInfo,你可以用这个来创建副本了
}
}
边城的刀声 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 didiaogao 的回复:]

引用 5 楼 bclz_vs 的回复:
GetAllFileInfos(String path)
这个方法楼主自己能实现吧


你给我的那段代码createdTime 和secons 没有定义??
[/Quote]
刚才我没编译过,来个能编译通过的。

public class FileInfoCount
{
public Int32 Count;
public FileInfo FileInfo;

public FileInfoCount(FileInfo fileInfo) { this.FileInfo = fileInfo; }
}

System.Collections.Generic.Dictionary<Int32, FileInfoCount> secondCountDic = new System.Collections.Generic.Dictionary<Int32, FileInfoCount>();

public void Main()
{
System.Collections.Generic.IEnumerable<FileInfo> fileInfos = GetAllFileInfos("D:\\Test");
DateTime baseTime = new DateTime(2000, 1, 1);
foreach (FileInfo fileInfo in fileInfos)
{
Int32 seconds = Convert.ToInt32((fileInfo.CreationTime - baseTime).TotalSeconds);
AddTime(seconds, fileInfo);
}

foreach (System.Collections.Generic.KeyValuePair<Int32, FileInfoCount> key in secondCountDic)
{
if (key.Value.Count >= 5) continue;

key.Value.FileInfo.CopyTo("");
}
}

private System.Collections.Generic.IEnumerable<FileInfo> GetAllFileInfos(string p)
{
throw new Exception("The method or operation is not implemented.");
}

private void AddTime(Int32 seconds, FileInfo fileInfo)
{
if (secondCountDic.ContainsKey(seconds)) secondCountDic.Add(seconds, new FileInfoCount(fileInfo));
else secondCountDic[seconds].Count++;
}
didiaogao 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bclz_vs 的回复:]
GetAllFileInfos(String path)
这个方法楼主自己能实现吧
[/Quote]

你给我的那段代码createdTime 和secons 没有定义??
didiaogao 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bclz_vs 的回复:]
如果只干一次的话,就遍历一次就行了,如果以后还要往里追加文件的话,那这种效率就不高了。
[/Quote]


图片 是一次性 插入进去的。。分组 也只需分一次
边城的刀声 2010-11-15
  • 打赏
  • 举报
回复
如果只干一次的话,就遍历一次就行了,如果以后还要往里追加文件的话,那这种效率就不高了。
didiaogao 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wuyazhe 的回复:]
还是用个定时器好了。1秒周期,搭配一个System.IO.FileSystemWatcher,将创建的文件添加列表,定时器中判断,不足5个就复制,反之清空列表等下一个周期。
不要考虑遍历文件目录,因为文件目录的遍历会随着你文件数目增加而效率降低最终拖垮你的整个系统。用System.IO.FileSystemWatcher比较合适。
[/Quote]

文件夹中的图片是添加好了以后,也就是说数目已经全部确定 我才分组的。也要按你说的这样吗
sth79 2010-11-15
  • 打赏
  • 举报
回复
等待,学习
兔子-顾问 2010-11-15
  • 打赏
  • 举报
回复
还是用个定时器好了。1秒周期,搭配一个System.IO.FileSystemWatcher,将创建的文件添加列表,定时器中判断,不足5个就复制,反之清空列表等下一个周期。
不要考虑遍历文件目录,因为文件目录的遍历会随着你文件数目增加而效率降低最终拖垮你的整个系统。用System.IO.FileSystemWatcher比较合适。
didiaogao 2010-11-15
  • 打赏
  • 举报
回复
bclz_vs
我去试试哦。谢谢啦。
freefei 2010-11-15
  • 打赏
  • 举报
回复
边城的刀声 2010-11-15
  • 打赏
  • 举报
回复
GetAllFileInfos(String path)
这个方法楼主自己能实现吧
边城的刀声 2010-11-15
  • 打赏
  • 举报
回复

public class FileInfoCount
{
public Int32 Count;
public FileFinfo FileInfo;

public FileInfoCount(FileFinfo fileInfo){this.FileInfo = fileInfo;}
}

Dictionary<Int32,FileInfoCount> secondCountDic = new Dictionary<Int32,FileInfoCount>();

public void Main()
{
IEnumerable<FileInfo> fileInfos= GetAllFileInfos("D:\Test");
DateTime baseTime = new DateTime(2000,1,1);
foreach(FileInfo fileInfo in fileInfos)
{
Int32 seconds = Convert.ToInt32((createdTime - fileInfo.CreationTime).TotalSeconds);
AddTime(seconds,fileInfo);
}

foreach(KeyValuePair<Int32,FileInfoCount> key in secondCountDic)
{
if(key.Value.Count>=5) continue;

key.Value.FileInfo.CopyTo(文件名);
}
}

private void AddTime(Int32 seconds,FileInfo fileInfo)
{
if(secondCountDic .ContainsKey(seconds)) secondCountDic .Add(secons,new FileInfoCount(fileInfo));
else secondCountDic[seconds].Count++;
}
didiaogao 2010-11-15
  • 打赏
  • 举报
回复
思路我有,就是循环判断那不知道咋搞
加载更多回复(2)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧