Изменить дату создания каталогов по дате входящих файлов
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2, 3  Next  :| |:
Total Commander -> Общие вопросы

#1: Изменить дату создания каталогов по дате входящих файлов Author: c930 PostPosted: Sun Jan 30, 2011 17:45
    —
Нужно изменить дату создания N-го количества подкаталогов (находящихся в одном каталоге) в соответствии с датой создания входящих в них файлов (т.к. оригинальные даты утерялись после перемещения каталогов другим командером).

Единственный способ, что я нашёл, это выделить (поиском или вручную в режиме CTRL+B файлы доноры и скопировать их временно в родительский каталог), а затем последоватьельно для каждого каталога копировать дату создания из нужного файла посредством кнопки
Load from file under cursor/Загрузить из файла под курсором в подменю Изменить атрибуты...

Или есть какой-нибудь более элегантный способ штатными средствами или с помощью плагинов? Вроде плагинов для работы с атрибутами не нашёл я.

Что интересно, если файл-донор находится в одном каталоге с подкаталогом у которого нужно сменить дату, то всё получается: выделяем подкаталог, ставим маркер на файл-донор и лезем в меню...
Но у меня файлы-доноры находятся в этих подкаталогах, и если я выделяю родительский каталог, маркер ставлю на файл - то после захода в меню смены атрибутов выделение перепрыгивает на файл под маркером Crying or Very sad. Из-за этого и приходится копировать файлы в родительский каталог.

#2:  Author: Tol!kLocation: Арзамас PostPosted: Sun Jan 30, 2011 18:38
    —
Есть touch.exe, но она не умеет работать с папками.
Найдёшь умеющую работать с папками – отблагодарю батником, ибо самому нужна.

#3:  Author: MVVLocation: Ростов-Дон PostPosted: Tue Feb 01, 2011 19:25
    —
Просто дату создания папки нужно ставить по самой ранней дате создания файлов и подпапок? Тут за полчаса можно набросать утилитку.


Code:
MIME-Version: 1.0
Content-Type: application/octet-stream; name="FixDate.7z"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="FixDate.7z"

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
FQYBACAAAAAAAA==

(обновлено - исправляет дату модификации по самой поздней дате элементов)

Рекурсивно не делал - Толик без проблем набросает батник. Smile


Last edited by MVV on Thu Feb 03, 2011 13:04; edited 4 times in total

#4:  Author: c930 PostPosted: Wed Feb 02, 2011 05:33
    —
MVV
Чёрт, мне неудобно! Право же не стоило!
Это у меня разовая задача (я надеюсь) и каталогов мало, можно всё вручную сделать, благо что можно даты копировать описанным в первом посте способом, а не вручную набирать. Я просто хотел поинтересоваться, какие ещё средства штатные есть или плагины, какие я не нашёл, для изменения даты. Поэтому я не указал чётко какой файл должен быть донором даты.

Надеюсь Tol!kу утилита будет полезна тоже!

Quote:
дату создания папки нужно ставить по самой ранней дате создания файлов и подпапок?
Нет в моём случае нужно изменить дату создания заданного каталога и всех дочерних (входящих в него) в идеале, т.к. их даты также потерялись, в соответствии с датой самого нового входящего файла, а не самого старого.

Но у меня чё-то не работает твоя утилита, дата заданного каталога не меняется...
(Кроме того, у меня видимо устаревшие понятия о дате создания, оставшиеся со времён DOSа. Меня интересует дата, которая отображается на панелях командера в режиме FULL, а это судя по данным, выдаваемым видимо встроенным контентным плагином TC есть - Дата модификации.)
...но ни та, ни другая дата у меня не изменяются при запуске утилиты твоей, и сообщения вроде тоже не выдаются никакие (может и не должны). Может я синтаксис неверно задаю.

Например, заданный каталог IMAX (в котором лежат файлы "доноры") имеет путь c:\TEMP\IMAX\
туда же в TEMP\ я и утилиту положил для простоты. Находясь в TEMP\ задаю:
FixDate c:\TEMP\IMAX\
и так пробовал
FixDate IMAX\, и так
FixDate IMAX
дата каталога не изменяется.

P.S. ОС Win XP

#5:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Feb 02, 2011 08:32
    —
Да там возни не больше, чем с батником. Smile

Уточнять надо, какая именно дата нужна. Потом, дата модификации каталога - штука ненадежная, система может изменять её сама. Но сделать-то конечно можно - обновил прикрепленный архив в предыдущем посте.

Рекурсивность проще сделать в батнике - проход по подкаталогам с вызовом утилиты, потом вызов для заданного каталога.

Батник тут простой:
Code:
@echo off
if -%1==- echo Parameters: %%WL &pause &goto :EOF
if -%1==-go goto do_work
for /f "usebackq delims=" %%f in (`type %1`) do call %0 go "%%f"
pause
goto :EOF

:do_work
for /d %%d in (%2\*) do call %0 go "%%d"
echo %2
"%~dp0FixDate.exe" %2\
Файл FixDate.exe должен лежать рядом, параметры кнопки в тотале - %WL, применять для выделенного набора папок.

Last edited by MVV on Thu Feb 03, 2011 13:00; edited 1 time in total

#6:  Author: sa PostPosted: Wed Feb 02, 2011 12:39
    —
MVV wrote:
дата модификации каталога - штука ненадежная, система может изменять её сама.
Вот тут-то утилитка и окажется полезной.

Только почему-то у меня не всегда подхватывается дата самого свежего файла, притом что, если этот файл оставить единственным в каталоге или если дату файла изменить на текущую, то дата подхватывается…

#7:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Feb 02, 2011 13:59
    —
По идее, должно работать. Я перечисляю все файлы по маске * в заданной папке:
Code:
      do {
         WCHAR* p=wfd.cFileName;
         if (*p=='.'&&(*(p+1)==0||*(p+1)=='.'&&!*(p+2))) continue;

         if (!date_set || CompareFileTime(&wfd.ftCreationTime, &max_modify)>0) {
            max_modify=wfd.ftLastWriteTime;
            date_set=1;
         }
      } while (FindNextFileW(hfd, &wfd));

А потом ставлю дату max_modify для папки. Сравнивать даты доверяю системной функции CompareFileTime.

Блин, щас смотрел на этот кусок и нашел ошибку. В условии сравнения-то я забыл исправить ftCreationTime на ftLastWriteTime. Laughing

Обновил пост с архивом.


Last edited by MVV on Wed Feb 02, 2011 14:21; edited 1 time in total

#8:  Author: sa PostPosted: Wed Feb 02, 2011 14:08
    —
А я правильно понял, что файлы должны сравниваться по дате модификации?

Ещё бы в заголовке темы поменять дату создания на дату модификации.

Add
MVV wrote:
Обновил пост с архивом.
Теперь утилита требует MSVCR100.dll. Так и должно быть?

#9:  Author: c930 PostPosted: Wed Feb 02, 2011 20:28
    —
MVV
Новая версия FixDate.exe
MD5:cd8bac45442c1976e336b27930cc51a1
при запуске из-под XP требует, как написал выше sa библиотеку MSVCR100.dll; Win2k говорит, что FixDate.exe не является приложением Win32; под Win98se не запускается, говорит ОС сменить надо.

#10:  Author: Tol!kLocation: Арзамас PostPosted: Wed Feb 02, 2011 20:53
    —
[off]
c930 wrote:
Надеюсь Tol!kу утилита будет полезна тоже!
Мне она нужна немного для других целей. В частности мне нужно передавать дату параметром и обрабатывать рекурсивно желательно самой утилитой, чтобы не плодились сущности.
[/off]

Нашёл GNU touch, которая работает с папками http://forum.wincmd.ru/viewpost.php?p=73646 (Пишут, что Cygwin touch тоже)

Code:
@echo off &chcp 1251 >nul &setlocal enableextensions
for /d /r %%d in (*) do call :t "%%d"
goto :eof

:t
for /f "delims=" %%t in ('dir /b/a-d/o-d %1') do touch.exe -r "%~1\%%t" %1 &goto :eof

запустить в корневой папке


Last edited by Tol!k on Fri Feb 11, 2011 12:33; edited 3 times in total

#11:  Author: c930 PostPosted: Wed Feb 02, 2011 20:55
    —
Quote:
Потом, дата модификации каталога - штука ненадежная, система может изменять её сама.
Дата создания ещё более ненадёжная штука, как следует из моих экспериментов, она меняется при перемещении каталога. А Дата модификации, если соответствующую галочку в настройках TC включить - остаётся неизменной при этом. Кроме того Дата модификации отображается в панелях TC в стандартном режиме FULL (который у меня всегда включён).

#12:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Feb 02, 2011 23:22
    —
Да, даты создания вообще ненадежны, а для папок - и даты модификации.

Quote:
Теперь утилита требует MSVCR100.dll. Так и должно быть?
Блин, умудрилась же чё-то вызвать из CRT, несмотря на переопределённую точку входа. Компилил просто на 10-ке, и забыл, что в новом проекте по дефолту такая вредность - подкупил размер, который меньше, чем в 6-ке, хотя при более правильной компиляции он ещё меньше - в очередной раз поправил пост.

#13:  Author: c930 PostPosted: Thu Feb 03, 2011 04:33
    —
Tol!k
Утилита из второго твоего поста
touch.exe 38,912 20.04.2005 20:41.20
md5: 6171241e363b229e0496fa5c242caa41
при запуске без параметров выдаёт сообщение об ошибке:
The procedure * could not be located in the DLL libintl3.dll

Пробовал на двух разных машинах, под Win XP и 98se.

Из батника - столько раз, сколько каталогов найдёт.

MVV
Утилита сама теперь вроде работает, а вот с кнопкой и батником - нет,
из-за пробелов похоже в именах заданных каталогов.
Спать пошёл, завтра ещё попробую.

Кнопка у меня такая:
Code:
TOTALCMD#BAR#DATA
FixDate.bat
%WL
wcmicons.dll,7
FixDate
%COMMANDER_PATH%\UTILITIEs\FixDate\

-1

#14:  Author: FlasherLocation: Москва PostPosted: Thu Feb 03, 2011 08:42
    —
c930 wrote:
из-за пробелов похоже в именах заданных каталогов.
А что мешает %WL заключить в кавычки?

#15:  Author: sa PostPosted: Thu Feb 03, 2011 10:32
    —
Flasher wrote:
А что мешает %WL заключить в кавычки?

Как обычно - проверка. Или кому-то помогло?



Total Commander -> Общие вопросы


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page 1, 2, 3  Next  :| |:
Page 1 of 3

Powered by phpBB © 2001, 2005 phpBB Group