按日期排序的目录中的文件列表

List of files from a directory ordered by date

如何从 NAV 中按日期排序的目录中获取文件列表? 我不能使用 File virtual table 因为没有日期键。 我试过使用 DotNet,但实现 IComparer 接口对我来说太复杂了。

有什么想法吗?

干杯

作为一种低技术含量的解决方案(即不需要任何外部组件),如何创建一个临时文件记录变量,在其中缓冲文件记录,用文件日期的可排序字符串表示填充路径字段,以及时间字段组合成 DateTime? [请忽略 PAGE.RUN - 那只是为了调试目的。]

在我的机器上,第一次调用 ShowFileOrder 显示如下:

第二次调用显示如下:

这就是文件在 Windows Explorer 中的样子:

希望对您有所帮助! :)

文件 table 的密钥究竟有什么问题?据我所知,日期和时间都是 sortable。在 Nav 2015 中测试。

不管怎样,如果你真的想用 .net 做的话,这里有一个例子。基数 table 是 File。第 属性 SourceTableTemporary = Yes 页。将所有文件信息整理好后,您可以使用它并按照您喜欢的方式对其进行排序。 或者您可以用数组中的值填充临时文件 table 并使用 setcurrentkey LOL

di  DotNet  System.IO.DirectoryInfo.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'   
fi  DotNet  System.IO.FileSystemInfo.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
arr DotNet  System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
i   Integer     

di := di.DirectoryInfo('c:\Temp\Tmp');
//arr.CreateInstance(GETDOTNETTYPE(fi),1); //not needed
arr := di.GetFileSystemInfos();
for i := 0 to arr.Length-1 do
 begin
  fi := arr.GetValue(i);
  Name := fi.Name;
  evaluate(Date, format(fi.LastWriteTime,8,1));
  insert;
 end;

或者你甚至可以sort file list with .Net

di  DotNet  System.IO.DirectoryInfo.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'   
fi  DotNet  System.IO.FileSystemInfo.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
arr DotNet  System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
arrKey  DotNet  System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
i   Integer     
TYPE    DotNet  System.Type.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'   
MethodInfo  DotNet  System.Reflection.MethodInfo.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
Parameters  DotNet  System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
Object  DotNet  System.Object.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

di := di.DirectoryInfo('c:\Temp\Tmp');
arr := di.GetFileSystemInfos();
fi := arr.GetValue(0);
arrKey := arrKey.CreateInstance(GETDOTNETTYPE(fi.LastWriteTime), arr.Length);
FOR i := 0 TO arr.Length-1 DO
 BEGIN
  fi := arr.GetValue(i);
  arrKey.SetValue(fi.LastWriteTime, i);
 END;

TYPE := GETDOTNETTYPE(arr);
MethodInfo := TYPE.GetMethods().GetValue(80);
Parameters := Parameters.CreateInstance(GETDOTNETTYPE(Object),2);
Parameters.SetValue(arrKey,0);
Parameters.SetValue(arr,1);
MethodInfo.Invoke(TYPE, Parameters);

FOR i := 0 TO arr.Length-1 DO
 BEGIN
  fi := arr.GetValue(i);
  MESSAGE(FORMAT(fi.LastWriteTime()));
 END;