Что нового

Перемещение пользовательских папок на другой диск

Пост номер 62 был отмечен как лучший ответ.

Автор
S

sas2242

Новичок
Сообщения
34
Репутация
0
Именно это я и хотел добиться изначально...

Переделал немного концепцию, теперь для получения списка файлов и папок используется _FileListToArrayRec.
Также показан пример удаления папки с файлами после обработки:

Код:
#include <File.au3>

OnAutoItExitRegister('_OnExit')

Global $sDest = @ScriptDir & '\Files'

If Not @Compiled And MsgBox(36, @ScriptName, 'Prepare the script for compilation?' & @CRLF & @CRLF & 'YES  --> Executes _FileDirInstall' & @CRLF & 'NO --> Executes script body') = 6 Then
    _FileDirInstall(@ScriptDir & '\123', $sDest & '\123', 0, '*', 1, -1)
    _FileDirInstall(@ScriptDir & '\456', $sDest & '\456', 0, '*', 1, -1)
    _FileDirInstall(@ScriptDir & '\789', $sDest & '\789', 0, '*', 1, -1)

    Exit
EndIf

;===== YOUR SCRIPT CONTENT GOES HERE =====
MsgBox(64, @ScriptName, 'My script', 0, Default)
;===== YOUR SCRIPT CONTENT GOES HERE =====

Func _OnExit()
    DirRemove($sDest, 1)
EndFunc

Func _FileDirInstall($sSrc, $sDest, $nFlag = 0, $sMask = '*', $iSubDirs = 0, $sIncludeName = -1)
    Local $aList, $sData, $sDirs, $sRead, $hFile

    If @Compiled Then
        Return SetError(-1)
    EndIf

    If StringStripWS($sIncludeName, 8) = '' Then
        $sIncludeName = 'InstalledDir'
    ElseIf $sIncludeName = -1 Then
        $sIncludeName = 'InstalledDir_' & StringRegExpReplace($sSrc, '^.*\\', '')
    EndIf

    $sIncludeName &= '.fdi'

    $aList = _FileListToArrayRec($sSrc, $sMask, 0, $iSubDirs)

    If @error Then
        Return SetError(1)
    EndIf

    $sDest = __GetMacros($sDest)

    For $i = 1 To $aList[0]
        If StringInStr(FileGetAttrib($sSrc & '\' & $aList[$i]), 'D') And Not StringInStr($sDirs, 'DirCreate(' & $sDest & ' & "\' & $aList[$i] & '")' & @CRLF) Then
            $sDirs &= 'DirCreate(' & $sDest & ' & "\' & $aList[$i] & '")' & @CRLF
            ContinueLoop
        EndIf
 
        $sData &= 'FileInstall("' & $sSrc & '\' & $aList[$i] & '", ' & $sDest & ' & "\' & $aList[$i] & '", ' & $nFlag & ')' & @CRLF
    Next

    $sData = $sDirs & $sData

    If $sData = '' Then
        Return SetError(2)
    EndIf

    $hFile = FileOpen(@ScriptDir & '\' & $sIncludeName, 2)
    FileWrite($hFile, '#include-once' & @CRLF & @CRLF & $sData)
    FileClose($hFile)

    $sRead = FileRead(@ScriptFullPath)

    If Not StringInStr($sRead, '#include "' & $sIncludeName & '"' & @CRLF) Then
        $hFile = FileOpen(@ScriptFullPath, 2)
        FileWrite($hFile, '#include "' & $sIncludeName & '"' & @CRLF & $sRead)
        FileClose($hFile)
    EndIf

    Return 1
EndFunc

Func __GetMacros($sStr)
    Local $aMacros = _
            StringSplit( _
            'ScriptDir|TempDir|StartupCommonDir|ProgramsCommonDir|StartMenuCommonDir|AppDataCommonDir|DesktopCommonDir|DocumentsCommonDir|FavoritesCommonDir|' & _
            'DesktopDir|MyDocumentsDir|FavoritesDir|StartupDir|ProgramsDir|StartMenuDir|AppDataDir|UserProfileDir|' & _
            'CommonFilesDir|ProgramFilesDir|SystemDir|WindowsDir|HomePath|HomeShare|HomeDrive', _
            '|')

    Local $sMacros

    For $i = 1 To $aMacros[0]
        $sMacros = Execute('@' & $aMacros[$i])
 
        If StringInStr($sStr, $sMacros) Then
            Return StringRegExpReplace(StringReplace($sStr, $sMacros, '@' & $aMacros[$i] & ' & "', 1, 2) & '"', ' & ""$', '')
        EndIf
    Next

    Return '"' & $sStr & '"'
EndFunc
Да, это то, что я хотел. Только мне кажется, что где-то в скрипте ошибка закралась, потому, что одна из папок добавляется в .exe и создается ее .fdi но не копируется при запуске.
upd из последних наблюдений, если в папке нет подпапок с файлами а только файлы, то DirCreate не создается в .fdi и соответственно файлы не копируются. Если в папке кроме файлов есть и подпапки, то соответственно DirCreate создает этот путь и тогда копируются и файлы. как то так.

upd 2 И еще один момент, когда я добавляю свои папки и фалы в .exe а потом при запуске копирую их в нужные директории, то по понятным причинам, сбрасываются атрибуты файлов и папок, это можно как-то пофиксить?
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 381
Репутация
2 381
если в папке нет подпапок с файлами а только файлы, то DirCreate не создается в .fdi
Поправил скрипт выше.

сбрасываются атрибуты файлов и папок, это можно как-то пофиксить?
Да, восстанавливать атрибуты на этапе распаковки, также поправил в скрипте выше.
Ещё немного изменил способ удаления папки после отработки скрипта - DirRemove не работает с файлами "Только для чтения", про это ограничение разработчики знают, вот только почему то в справке об этом не указали.
 
Автор
S

sas2242

Новичок
Сообщения
34
Репутация
0
CreatoR, кстати @ScriptDir тут тоже подставляет значение типа D:\\ Сейчас попробую обновленный вариант.

upd. да, теперь все работает как нужно, пока ничего не заметил, ну кроме того, что @ScriptDir два слеша пишет.
Сообщение автоматически объединено:

Меня вот заинтересовал один момент, в скрипте перемещение пользовательских папок на другой диск, есть такой момент, в скрипте содержимое указанных папок копируется, а потом сама папка удаляется, так вот, а если скрипт был запущен допустим с рабочего стола, а его папка как известно тоже сначала копируется(в другое место) а потом удаляется, то получается, что одно из условий скрипта выполнено не будет. Есть ли возможность как-то это обойти? Ну допустим, чтобы даже если скрипт был запущен с рабочего стола, то сам процесс выполнялся бы из другого места, чтобы во время работы скрипта, он смог выполнить все действия, то есть удалить папку раб.стол и на работу самого скрипта это никак не повлияло?
Сообщение автоматически объединено:

А еще в скрипте есть MsgBox(36, 'Внимание', 'Перенести пользовательские папки на диск ' & StringUpper($aDisks[$i]) & '\?') = 6Then А хотелось бы расширить немного эти сообщения, чтобы допустим при запуске .exe скрипт спрашивал "Вы уверены что хотите выполнить скрипт?" Ок и Отмена. ок -выполняет, отмена -завершает работу скрипта без изменений в системе. дальше если нажимаешь ок, то появляется сообщение "Подождите, выполняется работа скрипта..." ну и после завершения работы скрипта чтобы "Работа скрипта завершена, требуется перезагрузить компьютер!" Перезагрузить сейчас(перезагружает windows) и перезагрузить позже. Знаю,что для вас это пустяки, а я себе мозг сломал пытаясь добавить эти сообщения.))
 
Последнее редактирование:
Верх