按日期排序的目录中的文件列表
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;
如何从 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;