对目录

时间:2015-10-31 16:13:33

标签: file-handling

我有一个包含14.000个文件的目录。每天将20-50个文件添加到此目录中。

我想对放在此目录中的所有新文件执行操作,我只希望每个文件执行一次此操作。

我已经做了一个rutine并且它有效,但它真的很糟糕。

它是这样的:

  1. 将所有处于direcroty的文件存入Listbox
  2. 将包含所有已处理文件的文本文件加载到另一个列表框
  3. 比较列表框并提取所有新文件。
  4. 对新文件执行操作。
  5. 保存包含所有已处理文件的文本文件。
  6. 这是no的代码。 3:

    for i := 0 to FileListDir.Items.Count - 1 do
      if FileListHandled.Items.IndexOf(FileListDir.Items[i]) = -1 then
         FilesNeedHandling.Items.Add(FileListDir.Items[i]);
    

    rutine需要大约30-35秒才能完成。

    2个问题:

    1. 如何让我的rutine更快?
    2. 可以只获得" new"不使用我的rutine的目录中的文件。

2 个答案:

答案 0 :(得分:0)

“find”命令可用于此目的。

find <path of directory> -mtime -1 -print

这将打印过去一天内在给定目录下修改的文件

find <path of directory> -mtime -1 -exec <command> {} \;

这会查找过去一天内修改过的文件,并在每个文件上运行给定的命令

find <path of directory> -mmin -60 -exec <command> {} \;

它处理在过去60分钟内修改过的文件。

答案 1 :(得分:0)

好的,这不是Phyton而是Delphi(标签被删除了吗?)

我不得不再次重新考虑这一切。这次我成功了。

我写了自己的rutine来将文件加载到列表框中并对其进行冒泡排序。 之后,我可以提取未处理的文件名。

测试场景:4628个文件

测试分析如下:

将文件列表加载到: TFileListBox时间:2,24 TFileListBoxEx时间:1,52 TJvFileListBox时间:59,28(Wtf是否与Jvl libralies有关?)

拥有rutine来加载带有日期时间信息和冒泡排序的文件到: TListBox时间:1,61

 // Get files list
  if FindFirst(C_MailIncomingDir+'\*.eml', faAnyFile, Rec) = 0 then
  repeat
    Setlength(FileList, Length(FileList) + 1);
    Setlength(DateList, Length(DateList) + 1);
    FileList[High(FileList)]:= Rec.Name;
    DateList[High(DateList)]:= FileDateToDateTime(Rec.Time);
  until FindNext(Rec) <> 0;
  FindClose(Rec);

  // Sort
  // Bubble sort
  repeat
    Done:= True;
    for i:= 0 to High(FileList) - 1 do
      if DateList[i] > DateList[i + 1] then
      begin
        Done:= False;
        TempName:= FileList[i];
        FileList[i]:= FileList[i + 1];
        FileList[i + 1]:= TempName;

        TempDate:= DateList[i];
        DateList[i]:= DateList[i + 1];
        DateList[i + 1]:= TempDate;
      end;
  until Done;

  // Show in list
  FilesInDir.Clear;
  for i:= 0 to High(FileList) do
    FilesInDir.Items.Add(FileList[i] + '   ' + DateTimeToStr(DateList[i]));

通过按日期时间对文件进行排序,可以将所有尚未使用此行处理过的文件区分开来(对于4500个文件,为0,06而不是10秒):

for I := FileListHandled.Count to FilesInDir.Count-1 do
   FilesNeedHandling.Items.Add(FilesInDir.Items[i]);