Список файлов из каталога, упорядоченный по дате
Как я могу получить список файлов из каталога, упорядоченного по дате в NAV? Я не могу использовать виртуальную таблицу File, потому что нет ключа для даты. Я пытался с DotNet, но реализация интерфейса IComparer слишком сложна для меня.
Есть идеи?
ура
2 ответа
Как низкотехнологичное решение (т.е. не требующее каких-либо внешних компонентов), как насчет создания временной переменной File file, в которой вы буферизуете записи файла, заполняя поле Path сортируемым строковым представлением полей Date и Time файла, объединенных в DateTime? [Пожалуйста, игнорируйте этот PAGE.RUN - он был там только для целей отладки.]
На моей машине первый вызов ShowFileOrder отображает это:
Второй звонок показывает это:
И вот как файлы выглядят в проводнике Windows:
Надеюсь, это поможет!:)
А что именно не так с ключом таблицы файлов? Насколько я вижу, дата и время сортируются. Проверено в Nav 2015.
Во всяком случае, если вы действительно хотите сделать это с.net вот пример. Базовая таблица File
, Свойство страницы SourceTableTemporary = Yes
, После того, как вы получите всю информацию о файле в arrey, вы можете использовать ее и сортировать так, как вам нравится. Или вы можете заполнить таблицу временных файлов значениями из массива и использоватьsetcurrentkey
лол
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;
Или вы можете даже отсортировать список файлов с помощью .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;