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

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

Оффлайн Rjevsky [?]

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

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

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

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

[Файловая система] Пробел в начале названия файла
« Отправлен: Январь 21, 2012, 18:02:50 »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2741
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Rjevsky

с попыткой заставить перемещать папку
(нажмите для показа/скрытия)

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

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Rjevsky,
Мой вариант.
(нажмите для показа/скрытия)

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

Re: [Файловая система] Пробел в начале названия файла
« Ответ #2 Отправлен: Январь 21, 2012, 19:55:16 »

Оффлайн Rjevsky [?]

  • Новичок
  • *
  • Сообщений: 102

  • Автор темы
  • Репутация: 4
    • Награды
Всем спасибо, буду тестить.

Оффлайн Rjevsky [?]

  • Новичок
  • *
  • Сообщений: 102

  • Автор темы
  • Репутация: 4
    • Награды
madmasles Если на вашем варианте запустить проверку в цикл и натравить на множество папок, то на компьютере начинает постепенно увеличиваться виртуальная память. Хорошо бы исправить...

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

Re: [Файловая система] Пробел в начале названия файла
« Ответ #4 Отправлен: Январь 27, 2012, 22:47:14 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Rjevsky  [?]
Цитировать
Если на вашем варианте запустить проверку в цикл и натравить на множество папок
Код где? Я же не знаю как Вы это делаете.

Оффлайн Medic84 [?]

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

Функция с флагом 3 удалит из названия начальный и конечный пробел  :)

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

Оффлайн Rjevsky [?]

  • Новичок
  • *
  • Сообщений: 102

  • Автор темы
  • Репутация: 4
    • Награды
Код: 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


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

Re: [Файловая система] Пробел в начале названия файла
« Ответ #7 Отправлен: Январь 27, 2012, 23:05:42 »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2741
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Medic84
Пробел то получается не по краям, а в средине. И все пробелы то нельзя удалять, а только то что в начале имени перед символом "\".


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

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
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 [?]

  • Новичок
  • *
  • Сообщений: 102

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

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Rjevsky,
Попробуйте так, у меня работает.
(нажмите для показа/скрытия)

Оффлайн Rjevsky [?]

  • Новичок
  • *
  • Сообщений: 102

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

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Rjevsky,
Даже не знаю. Добавил во все циклы паузы. Параллельно гонял эти два скрипта почти два часа на старом и слабом ноутбуке, все нормально.
(нажмите для показа/скрытия)

(нажмите для показа/скрытия)

Оффлайн Rjevsky [?]

  • Новичок
  • *
  • Сообщений: 102

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

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

Re: [Файловая система] Пробел в начале названия файла
« Ответ #14 Отправлен: Январь 28, 2012, 16:40:47 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
5653 Просмотров
Последний ответ Февраль 05, 2010, 18:44:52
от gregaz
53 Ответов
21795 Просмотров
Последний ответ Февраль 22, 2012, 09:17:22
от StarEdik
5 Ответов
5023 Просмотров
Последний ответ Март 06, 2010, 13:23:01
от gregaz
14 Ответов
7856 Просмотров
Последний ответ Май 02, 2011, 13:57:30
от general66
1 Ответов
2666 Просмотров
Последний ответ Май 26, 2011, 16:26:07
от Pelerin
12 Ответов
5781 Просмотров
Последний ответ Ноябрь 07, 2011, 22:25:39
от Zaramot
7 Ответов
4271 Просмотров
Последний ответ Январь 10, 2012, 16:50:34
от Medic84
3 Ответов
3778 Просмотров
Последний ответ Август 05, 2012, 18:26:04
от ivsatel
0 Ответов
1422 Просмотров
Последний ответ Август 16, 2013, 12:43:28
от Talany
4 Ответов
376 Просмотров
Последний ответ Январь 13, 2019, 13:59:50
от TotKtoNado96