Русское сообщество AutoIt

  • Май 22, 2012, 14:12:34 *
  • Добро пожаловать, Гость
Пожалуйста, войдите или зарегистрируйтесь.

Войти
Расширенный поиск  

Новости:

Вы новичок? Хотите начать изучение AutoIt и не знаете с чего начать?

Для начала ознакомьтесь с темой Быстрый старт для работы с AutoIt.
Затем осмотрите раздел Инструменты и помощь по AutoIt.

Реклама

Автор Тема: [Файловая система] Пробел в начале названия файла  (Прочитано 1014 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Rjevsky [?]

  • Новичок
  • *
  • Репутация: 3
  • Offline Offline
  • Сообщений: 81
  • Версия AutoIt: 3.3.6.1
    • Награды
Версия AutoIt: 3.0 и выше

Описание: Нужен скрипт, который рекурсивно проверит все названия  файлов в папке и подпапках в ней. Если встретится файл или папка с пробелами в начале названия - переименовать, удалив пробелы.

« Последнее редактирование: Январь 21, 2012, 18:28:08 от Rjevsky »



  Записан

AZJIO [?]

Rjevsky

с попыткой заставить перемещать папку

_FileSearch здесь
« Последнее редактирование: Январь 21, 2012, 20:43:39 от AZJIO »



  Записан
Вытащи сначала бревно из своего глаза, тогда поймёшь как вытащить сучёк из глаза брата своего.

madmasles [?]

  • Модератор
  • *
  • *****
  • Репутация: 1426
  • Online Online
  • Пол: Мужской
  • Сообщений: 3819
  • Версия AutoIt: 3.3.6.1 - 3.3.9.4
    • Награды
Rjevsky,
Мой вариант.

Rjevsky [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 3
  • Offline Offline
  • Сообщений: 81
  • Версия AutoIt: 3.3.6.1
    • Награды
Всем спасибо, буду тестить.




  Записан

Rjevsky [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 3
  • Offline Offline
  • Сообщений: 81
  • Версия AutoIt: 3.3.6.1
    • Награды
madmasles Если на вашем варианте запустить проверку в цикл и натравить на множество папок, то на компьютере начинает постепенно увеличиваться виртуальная память. Хорошо бы исправить...




  Записан

madmasles [?]

  • Модератор
  • *
  • *****
  • Репутация: 1426
  • Online Online
  • Пол: Мужской
  • Сообщений: 3819
  • Версия AutoIt: 3.3.6.1 - 3.3.9.4
    • Награды
Rjevsky  [?]
Цитата
Если на вашем варианте запустить проверку в цикл и натравить на множество папок
Код где? Я же не знаю как Вы это делаете.




  Записан

Medic84 [?]

  • Администратор
  • *
  • *****
  • Репутация: 161
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 943
  • Версия AutoIt: 3.3.6.1
    • WWW
    • Награды
AZJIO  [?]
Цитата
Я обновил, я ж забыл что можно пробел в маску прописать, так быстрее сработает, а вот с папками какая то засада: заменять не хочет если такая папка уже есть, и флаг не помогает. С файлами проблем нет.
Зачем вообще париться с RegExp'ами? Есть стандартная функция:
Код: AutoIt [Выделить]
StringStripWS ( "string", 3)
Функция с флагом 3 удалит из названия начальный и конечный пробел  :)




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

Rjevsky [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 3
  • Offline Offline
  • Сообщений: 81
  • Версия AutoIt: 3.3.6.1
    • Награды
Код: AutoIt [Выделить]
#include <Array.au3>

$sDir = @ScriptDir & '\0'
;пишем:
While 1
    sleep(200)
;ищем и переименовываем папки:
$aDir = _FileSearch($sDir, '*', 2)
If Not @error Then
;~     _ArrayDisplay($aDir, 'С пробелами папки')
    For $i = $aDir[0] To 1 Step -1
        $sPath = StringRegExpReplace($aDir[$i], '[^\\]*$', '')
        $sDirNew = StringRegExpReplace($aDir[$i], '^.*\\\h*', '')
        DirMove($aDir[$i], $sPath & $sDirNew)
    Next
EndIf
sleep(200)
;ищем и переименовываем файлы:
$aFile = _FileSearch($sDir, '*', 1)
If Not @error Then
;~     _ArrayDisplay($aFile, 'С пробелами файлы')
    For $i = 1 To $aFile[0]
        $sPath = StringRegExpReplace($aFile[$i], '[^\\]*$', '')
        $sFile = StringRegExpReplace($aFile[$i], '^.*\\\h*', '')
        FileMove($aFile[$i], $sPath & $sFile, 1)
    Next
EndIf

;~ $aFile = _FileSearch($sDir, '*')
;~ If Not @error Then
;~     _ArrayDisplay($aFile, 'Без пробелов')
;~ EndIf

WEnd

Func _FileSearch($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib, $sFiles

    If Not StringInStr(FileGetAttrib($sPath), "D") Then
        Return SetError(1, 0, 0)
    EndIf
    If $iSubDir = 1 Then
        $sAttrib &= ' /S'
    EndIf
    If $iSort = 1 Then
        $sAttrib &= ' /O:N'
    EndIf
    Switch $iFlag
        Case 1
            $sAttrib &= ' /A-D'
        Case 2
            $sAttrib &= ' /AD'
        Case Else
            $sAttrib &= ' /A'
    EndSwitch
    $sOut = StringToBinary('0' & @CRLF, 2)
    $sPath = StringRegExpReplace($sPath, '\\+$', '')
    $sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
    $sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
    $aMasks = StringSplit($sFileMask, ';')
    For $i = 1 To $aMasks[0]
        If StringStripWS($aMasks[$i], 8) = "" Then
            ContinueLoop
        EndIf
        $sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'
        If $i < $aMasks[0] Then
            $sFiles &= ';'
        EndIf
    Next
    $hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
    While 1
        $sRead = StdoutRead($hDir, False, True)
        If @error Then
            ExitLoop
        EndIf
        If $sRead <> "" Then
            $sOut &= $sRead
        EndIf
    WEnd
    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
    If @error Or UBound($aOut) < 2 Then
        Return SetError(2, 0, 0)
    EndIf
    $aOut[0] = UBound($aOut) - 1
    Return $aOut
EndFunc   ;==>_FileSearch




  Записан

AZJIO [?]

Medic84
Пробел то получается не по краям, а в средине. И все пробелы то нельзя удалять, а только то что в начале имени перед символом "\".


Добавлено: Январь 28, 2012, 00:16:37
madmasles
Кстати, та же проблема... если папка целевая существует, то исходную переименовать не получися с помощью DirMove. Нужно придумывать алгоритм переноса внутренностей папки, а перед этим ещё сделать сортировку,чтоб переносить более глубоко вложенные папки, а потом корневые, чтоб найденные пути не испортить.
« Последнее редактирование: Январь 28, 2012, 00:16:37 от AZJIO, Причина: Объединение сообщений »



  Записан

madmasles [?]

  • Модератор
  • *
  • *****
  • Репутация: 1426
  • Online Online
  • Пол: Мужской
  • Сообщений: 3819
  • Версия AutoIt: 3.3.6.1 - 3.3.9.4
    • Награды
AZJIO  [?]
Цитата
а перед этим ещё сделать сортировку,чтоб переносить более глубоко вложенные папки
Сортировать, ИМХО, так можно.
Код: AutoIt [Выделить]
#include <Array.au3>

$sDir = @DesktopDir
$aReturn = _FileSearch($sDir, ' *', 1)
If @error Then
    MsgBox(16, 'Error ' & @error, '_FileSearch')
    Exit
EndIf
Dim $aTemp[$aReturn[0] +1][2]
For $i = 1 To $aReturn[0]
    $aTemp[$i][0] = $aReturn[$i]
    StringReplace($aReturn[$i], '\', '')
    $aTemp[$i][1] = @extended
Next
_ArraySort($aTemp, 1, 1, 0, 1)
For $i = 1 To $aReturn[0]
    $aReturn[$i] = $aTemp[$i][0]
Next
$aTemp = 0
_ArrayDisplay($aReturn)

;CreatoR; http://autoit-script.ru/index.php/topic,8266.msg55775
;Func _FileSearch
;...
Кстати, функция принимает маску поиска ' *', что ускоряет поиск. Завтра попробую свой вариант переделать.

Rjevsky,
А что делать, если в одной папке есть, например, '\  file.txt' и '\file.txt' или папки такие же?
« Последнее редактирование: Январь 28, 2012, 01:50:11 от madmasles »



  Записан

Rjevsky [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 3
  • Offline Offline
  • Сообщений: 81
  • Версия AutoIt: 3.3.6.1
    • Награды
madmasles  [?]
Цитата
А что делать, если в одной папке есть, например, '\  file.txt' и '\file.txt' или папки такие же?
Можно считать, что таких файлов нету, что бы не замарачиваться.
Если замарачиваться, то при наличии файла с тем же названием, но без пробела, на место пробела добавлять случайногенерируемое название Random из, например, 6 знаков.




  Записан

madmasles [?]

  • Модератор
  • *
  • *****
  • Репутация: 1426
  • Online Online
  • Пол: Мужской
  • Сообщений: 3819
  • Версия AutoIt: 3.3.6.1 - 3.3.9.4
    • Награды
Rjevsky,
Попробуйте так, у меня работает.




  Записан

Rjevsky [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 3
  • Offline Offline
  • Сообщений: 81
  • Версия AutoIt: 3.3.6.1
    • Награды
madmasles
Поменял параметры sleep на 1000, что бы быстрее увидеть эффект. Жор виртуальной памяти не прекратился.
На скрине показан момент прекращения работы откомпилированного скрипта после 15 минут работы. Если таклй скрипт поработает несколько дней, то компьютер еле шевелится.


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться




  Записан

madmasles [?]

  • Модератор
  • *
  • *****
  • Репутация: 1426
  • Online Online
  • Пол: Мужской
  • Сообщений: 3819
  • Версия AutoIt: 3.3.6.1 - 3.3.9.4
    • Награды
Rjevsky,
Даже не знаю. Добавил во все циклы паузы. Параллельно гонял эти два скрипта почти два часа на старом и слабом ноутбуке, все нормально.





  Записан

Rjevsky [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 3
  • Offline Offline
  • Сообщений: 81
  • Версия AutoIt: 3.3.6.1
    • Награды
madmasles  [?]
Цитата
Даже не знаю. Добавил во все циклы паузы. Параллельно гонял эти два скрипта почти два часа на старом и слабом ноутбуке, все нормально.
запустил ваш скрит - и та же беда. Виртуалка кушается очень быстро. И сам откомпилированный exe раздувается в размерах. Вот мои папки и файлы (упаковано 7zip 4 Мб): http://zalil.ru/32595873




  Записан
 


Похожие темы
Тема Автор Ответов Просмотров Последний ответ
[Файловая система] Корректный запуск файла
AutoIt для новичков
gregaz 4 1390 Последний ответ Февраль 05, 2010, 18:44:52
от gregaz
[Файловая система] Восстановление удаленного файла
AutoIt для новичков
gregaz 53 4788 Последний ответ Февраль 22, 2012, 09:17:22
от StarEdik
[Файловая система] Взять инфу из файла
AutoIt для новичков
modnik 5 1204 Последний ответ Март 06, 2010, 13:23:01
от gregaz
[Файловая система] Сменить кодировку имени файла
AutoIt для новичков
Redline 2 2378 Последний ответ Май 17, 2010, 13:52:02
от Redline
[Файловая система] Как быстрее прочитать концовку файла ?
AutoIt для новичков
gregaz 2 947 Последний ответ Август 30, 2010, 13:39:04
от gregaz
[Файловая система] Переименование файла по шаблону
AutoIt для новичков
general66 14 1414 Последний ответ Май 02, 2011, 13:57:30
от general66
[Файловая система] переименовывание файла
Стол заказов
Oliver Eyre 1 534 Последний ответ Май 26, 2011, 16:26:07
от Pelerin
[Файловая система] Запуск файла с расширением .mac
AutoIt для новичков
alexnasnet 12 732 Последний ответ Ноябрь 07, 2011, 22:25:39
от Zaramot
[Файловая система] Копирование файла при запуске
Стол заказов
trudovik 7 641 Последний ответ Январь 10, 2012, 16:50:34
от Medic84
[Файловая система] получение имени файла для создания папки
AutoIt для новичков
Tosyk 2 255 Последний ответ Февраль 10, 2012, 18:13:00
от madmasles


Реклама

* Последние сообщения на форуме
post Re: Как заменить метку времени файла на севере
[Автоматизация IE и Web-интерфейса] eropov Сегодня в 14:11:37
post Re: Авторизация в одноклассниках
[Автоматизация IE и Web-интерфейса] Arei Сегодня в 13:24:59
post Re: Смена IP адресса
[AutoIt для новичков] Zaramot Сегодня в 13:04:33
post Re: Авторизация в одноклассниках
[Автоматизация IE и Web-интерфейса] Александр Сегодня в 12:59:21
post Re: Выполнение скрипта при нажатии средней кнопки мыши
[AutoIt для новичков] madmasles Сегодня в 12:23:31
post [Мышь, клавиатура] Re: Выполнение скрипта при нажатии средней кнопки мыши
[AutoIt для новичков] Nurgazy Сегодня в 12:09:36
post Re: Объясните плз, как работать с массивами ArrayAdd и прочее...
[AutoIt для новичков] madmasles Сегодня в 12:08:03
post Объясните плз, как работать с массивами ArrayAdd и прочее...
[AutoIt для новичков] webmonster Сегодня в 12:03:38
post Re: Как заменить метку времени файла на севере
[Автоматизация IE и Web-интерфейса] ---Zak--- Сегодня в 11:39:56
post Как заменить метку времени файла на севере
[Автоматизация IE и Web-интерфейса] eropov Сегодня в 11:26:37

* Пользователи онлайн
  • Dot Гостей: 127
  • Dot Скрыт: 2
  • Dot Пользователей: 32
  • Dot Пользователи Online: