Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2015, 12:32   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию Что за проблема с получением даты изменения файлов?

Здравствуйте, уважаемые.
Нужно получить дату изменения двух файлов. С первым, текстовым, расположенном там же, где программка, проблем нет. А вот дату второго, экселевского, никак не удаётся получить. Почему - не понимаю. То ли из-за того, что этот файл в "сетке", то ли из-за того, что он нередактируемый...
Пробовал тремя способами. Этим, этим и этим. -1 возвращают все три... Какой ещё есть способ узнать дату изменения файла, который бы работал и с файлами в локальной сети и с уже "открытыми" файлами, недоступными для редактирования
Ship_1 вне форума Ответить с цитированием
Старый 16.11.2015, 15:47   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,799
По умолчанию

За все способы не скажу, но способ Serge_Bliznykov должен быть работоспособен.

Проблемы могут быть, если файл:
  • Недоступен текущему пользователю по тому же пути или по правам (при этом он может быть открыт в приложении, запущенном от имени администратора или системного пользователя локальной/сетевой службы (NT_AUTHORITY).
  • Открыт по пути, в котором нет возможности узнать дату/время файла -- обычно это какая-то экзотика, вроде WebDAV или чего-то похожего (SharePoint, Yandex.Disk...).
Vapaamies вне форума Ответить с цитированием
Старый 16.11.2015, 16:08   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
то ли из-за того, что он нередактируемый...
А сам проводник то показывает дату изменения верно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.11.2015, 16:09   #4
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Провёл ещё один эксперимент (почему-то раньше до него не додумался). Скинул тот файл, у которого дату получается проверить, по пути второго файла. Теперь и у него дата не проверяется... Видимо, дело таки в том, что он находится в локальной сети по пути типа "\\bilding.local\files\exchange " (без каких либо букв и прочего перед двумя бэкслешами в начале). Есть ли способ узнать дату изменения файла в этом случае?
Stilet, да, в проводнике дата нормальная

Последний раз редактировалось Ship_1; 16.11.2015 в 16:39.
Ship_1 вне форума Ответить с цитированием
Старый 16.11.2015, 17:02   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну не знаю... Это надо смотреть. Если проводник все показывает, значит что-то не так делаешь ты. Что именно можно сказать только на месте.
FindFirst еще попробуй но проверяй свойство ftLastAccessTime и ftLastWriteTime
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.11.2015, 18:04   #6
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Дык эта... Что ж тут можно неправильно сделать, если с другим файлом все три метода работают как надо? А с этим, который в локалке, ни один не работает. И если первый перенести в локалку - то уже и с ним ни один не работает...
По этому примеру попробовал и с FindFirst, чуть переделав, но и с ним результат тот же: у первого определяется, у того, который в локалке - нет...
Код:
procedure GetDtFl(const FileName: String; out ModificationTime: TDateTime);
var 
  SearchRec: TSearchRec;
  Success: integer;
  DT: TFileTime;
  ST: TSystemTime;
begin
   Success := SysUtils.FindFirst( FileName, faAnyFile, SearchRec );
   if ( Success = 0 ) and
      ( ( SearchRec.FindData.ftLastAccessTime.dwLowDateTime <> 0 ) or
      ( SearchRec.FindData.ftLastAccessTime.dwHighDateTime <> 0 ) )
   then
   begin
      FileTimeToLocalFileTime( SearchRec.FindData.ftLastAccessTime, DT );
      FileTimeToSystemTime( DT, ST );
      ModificationTime:=EncodeDateTime(st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
   end;
   SysUtils.FindClose( SearchRec );
end;

Даже попробовал бэкслеш на слеш поменять в пути "\\bilding.local\files\exchange ", всё равно не помогло

Последний раз редактировалось Ship_1; 16.11.2015 в 18:08.
Ship_1 вне форума Ответить с цитированием
Старый 16.11.2015, 18:55   #7
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Подключите сетевой ресурс в качестве локального диска.
Должно помочь.
kropotkina-alice вне форума Ответить с цитированием
Старый 16.11.2015, 23:41   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,799
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
Код:
   begin
      FileTimeToLocalFileTime( SearchRec.FindData.ftLastAccessTime, DT );
   end;
Ты не ту дату берешь. Надо брать ftLastWriteTime.
Vapaamies вне форума Ответить с цитированием
Старый 17.11.2015, 10:15   #9
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Vapaamies, спасибо за подсказку.
Код:
   if ( Success = 0 ) and
      ( ( SearchRec.FindData.ftLastAccessTime.dwLowDateTime <> 0 ) or
      ( SearchRec.FindData.ftLastAccessTime.dwHighDateTime <> 0 ) )
В этих случаях, как понимаю, тоже надо поменять? Но проблему получения даты файла в локалке это, конечно, не решило.
Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
Подключите сетевой ресурс в качестве локального диска.
Должно помочь.
Ну это понятно, только программка подразумевается для работы нескольких человек на нескольких компьютерах, и это одна из причин, по которой такой способ решения вопроса не подходит.

GetFileAttributesEx - как понимаю, это WinAPI? Странно, что даже он не работает... Но проводник же как-то отображает эту дату...
Ship_1 вне форума Ответить с цитированием
Старый 17.11.2015, 10:34   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

FileAge в локальной сети нормально возвращает время обновления файла. В твоем адресе bilding.local и files это что?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с получением страницы shvabrin Работа с сетью в Delphi 1 28.11.2011 22:49
Проблема с получением текста из label чужого окна, при том что, текст и класс уже известны. Человек_Борща Общие вопросы Delphi 1 15.01.2011 18:49
Проблема с получением имени zumm Общие вопросы Delphi 3 14.05.2010 13:06
Программа получения списка файлов директории и изменения атрибутов файлов roma86 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 09.06.2009 09:08
Запрет изменения даты Viteef Общие вопросы Delphi 0 20.02.2008 05:09