关于遍历文件的问题!谢谢

白s菜 2010-08-24 02:19:57
目前有这样的需求 ,某个文件夹下有 N多日志文件(单个200K左右大小) 日志文件是不断的在生成的 越来越多
现在做一个程序 把这些文件打包socket通讯发给某个接收端

问题 1 每次请求时传送1~1000个文件 下次就传1001~2000 在下次就2001 到3000 如何遍历的时候按某个标识去找第几个第几个文件?还有文件夹下的文件越来越多的时候 会存在读取性能问题吗?
问题 2 DirectoryInfo di = new DirectoryInfo("D:\\PubResult");
FileInfo[] files = di.GetFiles(); 这个按时间排序写在什么地方?要不然怎么确定发第几个文件出去?因为不断有新的文件生成 所以按时间排顺序可能比较好控制点
谢谢大家~
...全文
160 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Peter200694013 2010-08-26
  • 打赏
  • 举报
回复
使用
Directory
File
白s菜 2010-08-26
  • 打赏
  • 举报
回复
谢谢各位给的思路~
熙风 2010-08-25
  • 打赏
  • 举报
回复
学习········
jeven_xiao 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wwm402654282 的回复:]
不需要那么复杂 你先将所有日志文件获取 然后添加到ArrayList中 发送的时候循环发送
1~1000 或1001~2000 ...
例子ArrayList ArrayList = new ArrayList();//初始化容量

C# code

ArrayList ArrayList = new ArrayList();//初始化容量
/// <summary……
[/Quote]


我顶这个,这样就行了呀 LZ
LVSmile 2010-08-24
  • 打赏
  • 举报
回复
可以设置几个目录:处理成功目录 SucessPath 处理失败目录 FailedPath
将处理成功的日志文件移到SucessPath 处理失败的日志文件移到FailedPath 同时将原来目录下的日志文件删除,这样就保证了要出里的目录中只有未处理过的日志文件,每次处理1000个就可以了。
Snoworld 2010-08-24
  • 打赏
  • 举报
回复
wwm402654282 2010-08-24
  • 打赏
  • 举报
回复
不需要那么复杂 你先将所有日志文件获取 然后添加到ArrayList中 发送的时候循环发送
1~1000 或1001~2000 ...
例子ArrayList ArrayList = new ArrayList();//初始化容量

ArrayList ArrayList = new ArrayList();//初始化容量
/// <summary>
/// 发送
/// </summary>
/// <param name="a">从第几项开始</param>
/// <param name="b">从第几项结束</param>
public void add(int a,int b) {
for (int i = a; i < b; i++)
{
if (i<ArrayList.Count)
{
//如果是将1-1000打包后发送 这里可以进行打包 然后发送这个打包的文件
//否则
ad(ArrayList[i].ToString());//发送 }
}
}

ArrayList
鸭梨山大帝 2010-08-24
  • 打赏
  • 举报
回复
问题 1 每次请求时传送1~1000个文件 下次就传1001~2000 在下次就2001 到3000 如何遍历的时候按某个标识去找第几个第几个文件?

将需要传送的文件列表根据名称/修改时间/创建时间/大小等等排序都行,保存到一个Dictionary<int SortNumber,string FileFullName>,然后每次取Dictionary中SortNumber为1~1000,1001~2000,依次类推.

还有文件夹下的文件越来越多的时候 会存在读取性能问题吗?

量不是巨大的时候一般不会(个人实践N>2W以上会有些影响,跟硬盘速度,以及格式类型有关,最好NTFS)


问题 2 DirectoryInfo di = new DirectoryInfo("D:\\PubResult");
FileInfo[] files = di.GetFiles(); 这个按时间排序写在什么地方?

同问题一,将顺序用dic 的key(int) 暂存起来

要不然怎么确定发第几个文件出去?因为不断有新的文件生成 所以按时间排顺序可能比较好控制点

将暂存dic中的文件发送完毕,再更新该dic.并将日志移走.(如果不允许移走就需要多弄一个保存状态的集合,列举出哪些文件(根据文件名)已经传送了,传送过的不再加入队列)

这样就没有问题了.

边城的刀声 2010-08-24
  • 打赏
  • 举报
回复

List<FileInfo> fileInfos = new List<di.GetFiles()>;
fileInfos.Sort(delegate(FileInfo f1,FileInfo f2){return f1.CreateionTime.CompareTo(f2.CreationTime);}); //先按创建时间排下序

for(i=0;i<1000;i++)
{
SocketHelper.SendFile(fileInfos[i]);
}

wuyq11 2010-08-24
  • 打赏
  • 举报
回复
文件分目录保存
List<FileInfo> t=new List<FileInfo>();
t.Sort(delegate( FileInfo p1, FileInfo p2) { return p1.LastAccessTime.CompareTo(p2.LastAccessTime); });

public class FileComparer : IComparer<FileInfo>
{
public int Compare(FileInfo x, FileInfo y)
{
return x.LastAccessTime.CompareTo(y.LastAccessTime);
}
}
}
System.IO.DirectoryInfo di = new DirectoryInfo(dirPath);
FileInfo[] fileInfos = di.GetFiles();
Array.Sort(fileInfos, new FileInfoCompare());
白s菜 2010-08-24
  • 打赏
  • 举报
回复
谢谢楼上的 但是目前文件名生成是有固定规则的不能按照编号了自增了 根据系统异常类型 生成的文件名都不一样 怎么按创建时间排序呢
HolyPlace 2010-08-24
  • 打赏
  • 举报
回复
其实你的很多问题都可以用日志文件名去解决,比如:你要找第几个文件,你可以把你的文件名按照编号了自增,这样你现在请求到的是多少下级就读后面的。还有FileInfo[] files = di.GetFiles(); 这个默认是按照文件名排序的,按照文件编号的话又解决了你的问题。

110,571

社区成员

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

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

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