159

Что вы используете, когда хотите обновить поле с измененной датой файла в Windows?

  1. Команды, доступные через C++, .NET, C # или что-то родное для Windows (предпочтительно Vista)
  2. инструменты / приложения желательно бесплатные, а также по возможности с открытым исходным кодом

Изменить: здесь уже есть страница для приложений, как указано CheapScotsman здесь.

Если кто-нибудь знает, как я могу сделать это через C++, C #, WSH или что-то подобное, ну и хорошо, иначе я бы подумал, что все остальное рассматривается в связанном вопросе.

30 ответов30

342

Если вы хотите прикоснуться к отметке даты файла в Windows, используйте следующую команду в командной строке:

copy /b filename.ext +,,

(где filename.ext - это имя вашего файла). Знак +,, является специальным флагом для copy указывающим на простое обновление даты / времени в файле:

* Изменение времени и даты файла

Если вы хотите назначить текущее время и дату файлу без изменения файла, используйте следующий синтаксис:

copy /b Source+,,

Запятые указывают на пропуск параметра Destination.

Редактирование на основе комментариев Луми и Джастина: поместите это в пакетный файл, например. touch.cmd

@COPY /B %1+,, %1

Это работает, даже если файл не находится в текущем каталоге (протестировано в Windows 7).

160

Я использовал и рекомендую unxutils, которые являются родными портами Win32 многих распространенных утилит Unix. Там есть touch команда.

95

Если все, что вам нужно, это изменить дату последнего изменения файла (в моем случае):

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date
56
type nul >>file & copy file +,,
  • Создает file если он не существует.
  • Оставляет содержимое файла в покое.
  • Просто использует cmd встроенные модули.
  • Время последнего доступа и создания обновлено.

ОБНОВИТЬ

Г! Это не работает с файлами, доступными только для чтения, тогда как touch работает. Я предлагаю:

:touch
if not exist "%~1" type nul >>"%~1"& goto :eof
set _ATTRIBUTES=%~a1
if "%~a1"=="%_ATTRIBUTES:r=%" (copy "%~1"+,,) else attrib -r "%~1" & copy "%~1"+,, & attrib +r "%~1"
32

@ Тир-том- взрывы:

Вот объяснение Technet таинственных '+' и запятых:

копия / б Источник +,,

Запятые указывают на пропуск параметра Destination.

Команда copy поддерживает объединение нескольких файлов в один целевой файл. Поскольку пустое место назначения нельзя указать с помощью пробела в командной строке, для обозначения этого можно использовать две запятые.

И это ссылка на команду Technet для копирования: http://technet.microsoft.com/en-us/library/bb490886.aspx

22

Если вы хотите написать код самостоятельно, .NET предлагает File.SetLastAccessTime, File.SetCreationTime и File.SetLastWriteTime .

21

вот рекурсивная версия с использованием powershell ... это изменит время последнего изменения для всех файлов и подкаталогов, а также файлов в подкаталогах этого каталога

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}
15

Проект GnuWin32 имеет порты Windows версий Gnu утилит командной строки Unix.

Он поставляется в виде нескольких отдельных пакетов, и вы можете устанавливать только те команды, которые вам нужны, без каких-либо других зависимостей. Для touch вам понадобится пакет CoreUtils .

15

Я попытался это создать пустой файл в моем пакетном скрипте. Вы можете использовать это:

ECHO text>file1.txt
14

cygwin поставляется с touch Я знаю, что вы упомянули, что вы не хотите устанавливать весь фреймворк, но Cygwin довольно легкий и может вызываться из окна командной строки DOS без включенной всей командной строки, подобной Unix.

Вы также можете контролировать, какие инструменты устанавливать, чтобы вы могли просто установить файл touch.exe и оставить остальную часть фреймворка.

14

Вот простой regfile, который я написал, чтобы добавить "сенсорный" щелчок правой кнопкой мыши в проводнике Windows. Также было бы легко написать скрипт, так как он просто вызывает:

cmd.exe /c copy %1+nul %1 /by
12

Родные порты win32 для многих команд Unix, включая сенсорные.

Я использовал его раньше, и он работает хорошо - без установки, без DLL и т.д.

11

Попробуйте это из CodeProject.

  • Не нужно устанавливать.
  • Если вы хотите, вы можете даже изменить источник.
9

Вы также можете установить Cygwin, который дает вам Touch, а также множество других команд * NIX.

5

Из аналогичного вопроса о переполнении стека.

Для обновления меток времени (игнорируя другие функции touch) я бы выбрал:

copy /b filename.ext +,,
5

Есть порты Windows многих утилит Unix. Посмотрите проекты unxutils или GnuWin32 .

4

с веб-сайта:

Funduc Software Touch - это бесплатная «сенсорная» утилита, которая позволяет изменять метки времени / даты и / или атрибутов для одного или нескольких файлов. Кроме того, FS Touch может добавлять / вычитать указанное количество секунд из существующего времени файла. Вы можете указать, какие файлы и / или подкаталоги следует изменить с помощью «сложных файловых масок». Программа может быть запущена из интерактивного или командной строки. Новым в версии 7.2 является переключатель командной строки для изменения метки времени изменения файла +/- указанное количество секунд.

FS Touch работает на Windows XP, Vista, Windows 7 и Windows 8.

4

Как насчет кода проекта "Touch для Windows": http://www.codeproject.com/KB/applications/touch_win.aspx

редактировать; Тот же вопрос, что и здесь: https://stackoverflow.com/questions/51435/windows-version-of-the-unix-touch-command/51439

3

Если вы используете git для одного или нескольких проектов, в git-bash для Windows на базе mingw есть команда touch . Я хочу поблагодарить @ greg-hewgill за указание на то, что утилиты 'nix существуют для windows, потому что именно это навело меня на мысль попробовать touch в git-bash.

3

Этот контент может быть сохранен в reg-файл. Это добавит контекстное меню правой кнопкой мыши для всех файлов с возможностью "Touch File" (протестировано в Windows 7). Скопируйте все следующие строки в файл reg. Запустите файл и подтвердите вопрос. Щелкните правой кнопкой мыши по любому файлу (или нескольким файлам) - теперь доступна опция "Touch File".

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\Touch File]

[HKEY_CLASSES_ROOT\*\shell\Touch File\command]
@="cmd /C copy /b \"%1\" +,,"
3

в PowerShell попробуйте:

ni fileName.txt

NI - это псевдоним командлета New-Item .

2

Я нашел быстрый способ сделать это, если у вас установлен vim (не подходит для больших файлов, откроет весь файл, затем закроет его ...)

vim foobar.txt +wq!

«+» Устанавливает аргумент для запуска следующих команд. «WQ!"это" написать, выйти, заставить ". Это откроет файл, сохранит и закроет его сразу после этого.

2

Сохраните следующий файл как touch.bat в папке% windir%\system32 или добавьте папку, в которой он сохраняется, в переменную среды PATH:

@echo off
if %1.==. goto end
if not exist %1 goto end
copy /b %1 +,, > nul
echo %1 touched!
:end

Пример использования:

touch *.cpp
touch somefile.c

Ссылка: Microsoft KB 69581

1

Я хотел, чтобы «сенсорная» функция клонирования / дублирования файлов датировалась из другого файла, изначально, и была пригодна для использования из пакетного файла.

Таким образом, «перетащите» видеофайл в пакетный файл, FFMPEG запускается, затем «Дата создания» и «Дата изменения» из входного файла копируются в выходной файл.

Сначала это казалось простым, пока вы не обнаружили, что пакетные файлы ужасны при обработке имен файлов в Юникоде, встроенная PowerShell портится с символами имен файлов, и двойное экранирование - это кошмар.

Моим решением было сделать «сенсорную» часть отдельным скриптом PowerShell, который я назвал «CLONE-FILE-DATE.ps1», и он содержит:

param
(
  [Parameter(Mandatory=$true)][string]$SourcePath,
  [Parameter(Mandatory=$true)][string]$TargetPath
)

(GI -LiteralPath $TargetPath).CreationTime  = (GI -LiteralPath $SourcePath).CreationTime
(GI -LiteralPath $TargetPath).LastWriteTime = (GI -LiteralPath $SourcePath).LastWriteTime

Тогда вот пример использования в моем пакетном файле 'CONVERT.BAT':

%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"

CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"

Я думаю, что PowerShell читабельна, поэтому я просто объясню, что такое пакетная речь:

% ~ dp0 - текущий каталог командного файла.

% ~ 1 - путь к файлу, помещенному в пакет без кавычек.

CHCP 65001> nul устанавливает символы в UTF-8 и глотает вывод.

-ExecutionPolicy ByPass позволяет запускать PowerShell без необходимости изменять глобальную политику, которая предотвращает случайное выполнение сценариев людьми.

1

Пытаться

fsutil файл createnew new.txt 0

1

Пять вариантов, упомянутых выше, плюс еще три, не упомянутые здесь, можно найти в SuperUser: "Windows Recursive Touch Command"

1

Это немного не связано с первоначальным вопросом, но я считаю, что это очень полезно для Windows из-за графического интерфейса.

Я использую утилиту TouchPro, которая предоставляет графический интерфейс (встроен в оболочку проводника):

http://www.jddesign.co.uk/products/touchpro/touchpro.htm

0

Люди из Unix исправили общую проблему обновления даты любого файла с помощью команды touch . Однако для Windows иногда более простой метод возможен для особых случаев.

Мне нужно обновить временную метку ярлыка приложения в Windows 8.1, чтобы сделать видимыми изменения в цвете фона плитки приложения, см. Этот вопрос ТАК. Вместо того, чтобы реализовывать один из умных инструментов выше, мне легче редактировать поле комментариев ярлыка. Большинство людей оставляют это пустым, но, конечно, полезный комментарий быстро придумывается. И если комментарий существует, добавление или удаление последнего периода никогда не повредит.

0

Что ж, если вы действительно хотите иметь команду touch , вы можете поместить ее в пакетный файл с именем touch.bat и вставить в C:\Windows:

TYPE NUL >>%1

Достаточно просто.

0

Я ценю это старый вопрос, я только что обнаружил прикосновение к моей системе Windows 10. Я скачал и установил Git отсюда (я думаю), и похоже, что touch и различные другие утилиты находятся в папке bin.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .