1

Тема: CMD/BAT: Удаление пустого каталога

Привет честной компании!
Нарисовалась проблема, голову сломал...
В рабочей директории содержится ряд папок с именами 001; 002 и т.д.  В папках фалы, имя которых должно включать в себя имя папки.
По умолчанию программа добавляет новые файлы в папку с последним номером.
Но в процессе работы у пользователя возникает необходимость вставить новую папку между сущесвующими.
Т.е. допустим, имеется 8 папок, а ему нужно встроить новую на место третьей и добавить в нее новые файлы.
Я перемещаю папку 008 в 009 и переименовываю содержащиеся в ней файлы, 007 в 008 ... 003 в 004,  и создаю папку 003.
Но, если какой либо файл из перемещаемых папок блокирован, выполнить откат становится затруднительно.
Решил в качестве проверки перемещать без переименовывания в вновь создаваемую в рабочей директории папку ТЕМР, и в случае успешного завершения возвращать в рабочую директорию с новыми именами.
Но оставлять каталог ТЕМР в рабочей директории нельзя!
Как его удалить?
Насколько мне известно, CMD такой возможности не предоставляет. Но может, кто либо подскажет какой либо иной вариант?
Поначалу использовал %ТЕМР% и все было гладко до тех пор, пока рабочая директория размещалась на системном диске.
А какой диск предпочтет пользователь неизвестно...

2

Re: CMD/BAT: Удаление пустого каталога

privatbox пишет:

Привет честной компании!
Нарисовалась проблема, голову сломал...

Привет и вам.

В рабочей директории содержится ряд папок с именами 001; 002 и т.д.  В папках фалы, имя которых должно включать в себя имя папки.
По умолчанию программа добавляет новые файлы в папку с последним номером.
Но в процессе работы у пользователя возникает необходимость вставить новую папку между сущесвующими.

Может быть составите алгоритм или представите код? Потому как у меня вырисовывается такая картина:

  1. Получить список имеющихся папок

  2. Получить имя папки, если такой нет, то создать, иначе:

    • Попытаться прочесть файлы (или проверить handle, утилитой от М.Руссиновича), если всё ок - переместить файлы из "исходной" директории в "исходная+1"

    • иначе вывести предупреждение или "покиллять" приложения, открывшие файлы

  3. -> п.1

Решил в качестве проверки перемещать без переименовывания в вновь создаваемую в рабочей директории папку ТЕМР, и в случае успешного завершения возвращать в рабочую директорию с новыми именами.
Но оставлять каталог ТЕМР в рабочей директории нельзя!
Как его удалить?
Насколько мне известно, CMD такой возможности не предоставляет. Но может, кто либо подскажет какой либо иной вариант?


rd /s/q "path_to_TEMP_directory"

Поначалу использовал %ТЕМР% и все было гладко до тех пор, пока рабочая директория размещалась на системном диске.
А какой диск предпочтет пользователь неизвестно...

А почему не устраивает другой диск? К примеру, мне удобно использовать (и переопределять в скриптах - для отладки) некоторые переменные оболочки, в т.ч. %TMP% и %TEMP%? К чему такая категоричность и почему это так важно, ведь "временная директория" на то и "временная"? В вашей записи я ответа не нашёл.

3 (изменено: Rom5, 2013-05-13 19:12:24)

Re: CMD/BAT: Удаление пустого каталога

offtop
Если вопрос не стоит ребром о том, что делать "сдвиг" имен папок надо именно в своей программе, то можно пользователю предложить воспользоваться сторонними утилитами.

Например, в менеджере "Total Commander" есть очень удобная утилитка пакетного переименования - Multi-Rename Tool вызываемая по Ctrl+M после отметки переименовываемых файлов/директорий.

В качестве будущих имен можно взять часть предыдущего имени плюс счетчик с указанием начального значения. Если из утилиты еще не вышли - можно выполнить откат переименования.

Вот, скриншот:
http://savepic.net/3615408m.png

...

UNDYING пишет:

Поначалу использовал %ТЕМР% и все было гладко до тех пор, пока рабочая директория размещалась на системном диске.
А какой диск предпочтет пользователь неизвестно...

А почему не устраивает другой диск? К примеру, мне удобно использовать (и переопределять в скриптах - для отладки) некоторые переменные оболочки, в т.ч. %TMP% и %TEMP%? К чему такая категоричность и почему это так важно, ведь "временная директория" на то и "временная"? В вашей записи я ответа не нашёл.

Не устраивает видимо тем, что рабочая папка и системная "тэмповая" могут получиться на разных томах, что приведет при "переименованиях" к физическому перемещению туда и обратно папок пользователя со всем содержимым, т.е. времязатратно...

WBR. Roman

4

Re: CMD/BAT: Удаление пустого каталога

UNDYING пишет:

rd /s/q "path_to_TEMP_directory"

Спасибо, работает!
Но команда незнакомая. Где можно почитать о ней?

А почему не устраивает другой диск?


Если системный диск С: а рабочая директория на другом диске, то при попытке выполнить MOVE "D:\path_directory" %TEMP% получаю сообщение "Отказано в доступе".  Я это понял так, что перемещение каталога доступно лишь в пределах одного диска, а %TEMP% расположена именно на системном.

Попытаться прочесть файлы (или проверить handle, утилитой от М.Руссиновича)

1.  Каждая из 00N папок содержит еще целое дерево директорий и файлов там чертова туча. Проверять каждый - поседеешь. А MOVE, раз - и готово.
2. По техзаданию должно быть не более 3 файлов, .bat .ini .dat .  Поначалу требовали вообще одним батником ограничиться, но тут уж я рогом уперся.

Еще раз хочу искренне поблагодарить за помощь!
И Rom5 тоже!

5

Re: CMD/BAT: Удаление пустого каталога

Но команда незнакомая. Где можно почитать о ней?

Как обычно:

rd /?

Или в справке (зависит от ОС).

Я это понял так, что перемещение каталога доступно лишь в пределах одного диска,

Именно.

6

Re: CMD/BAT: Удаление пустого каталога

privatbox пишет:

Т.е. допустим, имеется 8 папок, а ему нужно встроить новую на место третьей и добавить в нее новые файлы.
Я перемещаю папку 008 в 009 и переименовываю содержащиеся в ней файлы, 007 в 008 ... 003 в 004,  и создаю папку 003.

Что-то много преобразований для одной "транкзации", м.б. стоит переработать алгоритм? Или вы, в данном случае, работаете с данными, поступающими от другой программы (вид и структура данных зависит не от вас)?
Вообще в данном случае стоит задуматься о жёстких ссылках (hardlink)?

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

Что-то вроде такого:


:: renaming with rollback
set fromdir=001
set todir=002
set log=work.log
:: generate test data
call :generate
:: create moving log
call :prepare %fromdir%
for /f "tokens=*" %%a in ('type %log%') do (
:: move
call :move %%a %fromdir% %todir%) 
:: rollback
for /f "tokens=*" %%a in ('type %log%') do (
call :rollback %%a %fromdir% %todir%) 
exit /b

:generate
if exist %fromdir% rd /s/q %fromdir%
if exist %todir% rd /s/q %todir%
md %fromdir%
md %todir%
for /l %%a in (1,1,99) do (echo.>%fromdir%\%%a.file)
for /l %%a in (101,1,199) do (echo.>%todir%\%%a.file)
exit /b

:prepare
dir /b /a /s %1 > %log%
exit /b

:move
setlocal enabledelayedexpansion
set name=%1
move /y !name! !name:%2=%3!
exit /b & endlocal

:rollback
setlocal enabledelayedexpansion
set name=%1
move /y !name:%2=%3! !name! 
exit /b & endlocal

Решил в качестве проверки перемещать без переименовывания в вновь создаваемую в рабочей директории папку ТЕМР, и в случае успешного завершения возвращать в рабочую директорию с новыми именами.
Но оставлять каталог ТЕМР в рабочей директории нельзя!
Как его удалить?
...
Я это понял так, что перемещение каталога доступно лишь в пределах одного диска, а %TEMP% расположена именно на системном.

Как вариант (robocopy в составе ОС, начиная с Vista и новее):


robocopy "from" "to" /mov

или


robocopy "from" "to" /move