Что нового

[Файловая система] Filecopy удачно копирует только на первом цикле

ildar

Осваивающий
Сообщения
252
Репутация
29
Filecopy на втором и следующих циклах не копирует файлы, кусок кода:
Код:
If $sComp[0] = 0 Then
        MsgBox(0, "Внимание!", "Не выбраны адресаты")
	  ElseIf $aIN[0] = 1 Then
		MsgBox(0, "Внимание!", "Нет файлов для копирования")
	  Else
		  ProgressOn("Process", 'Идет копирование файлов', '',0,0,18)
		  For $i = 1 To $sComp[0]
			    DriveMapAdd("K:", "\\" & $sComp[$i] & "\c$", 0, $sComp[$i] & '\' & $sLogin, $sPasswords)
			    For $a = 1 to $aIN[0] - 1					
					$scale = $i / 67 * 100
					ProgressSet( $scale, $aIN[$a] & '==>' & $sComp[$i])
			        If StringInStr(FileGetAttrib($aIN[$a]), "D") Then						
						$Error = DirCopy($aIN[$a], 'K:' & $sOUT, 1)
					Else						
						$Error = FileCopy($aIN[$a], 'K:' & $sOUT, 1)	; это место меня интересует
 					       ; $Error = FileCopy($aIN[$a + 1], 'K:' & $sOUT, 1)  ; пробовал добавить строку копирования - не копирует
					EndIf
					if $Error = 1 then
                              $num = "копирование успешно"
                         Else
						      $num = "копирование не успешно"
					EndIf
				Next
				DriveMapDel("K:")
				GUICtrlSetData($myLog, $sComp[$i] & ' - ' & $num)
			Next
			ProgressSet( 100, "Готово")
			Sleep(1000)
			ProgressOff()
	  EndIf
пробовал добавить строку копирования, чтобы в одном(первом) цикле скопировал из массива следующий файл - не копирует. Входные данные нормальные. Более часа потерял, не понимаю где ошибка.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Пугает что ты и для каталогов, и для файлов используешь один и тот же путь

Код:
If StringInStr(FileGetAttrib($aIN[$a]), "D") Then                       
                        $Error = DirCopy($aIN[$a], 'K:' & $sOUT, 1)
                    Else                        
                        $Error = FileCopy($aIN[$a], 'K:' & $sOUT, 1)    
                    EndIf


Хотя для каталогов в DirCopy пути задаются без конечного обратного слэша,
а для файлов в FileCopy с ним.

Может быть в этом проблема?

тяжело тебе помогать, потому что отсутсвует значительная часть кода - откуда берётся список файлов, как он выглядит, ...
 
Автор
ildar

ildar

Осваивающий
Сообщения
252
Репутация
29
C2H5OH
Спасибо за поправку, не учел слэш. Это не помогло.
Появилось подозрение, что в массиве где хранятся пути файлов для копирования, начиная со второй ячейки вместе наименованием имеется спецсимвол(ы), который не дает понять функции наименование файла. Через _Arraydisplay или Msgbox этого не видно, а как развернуть массив, чтобы увидеть его полное содержимое (спецсимволы, пробелы).
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
ildar
Если у объекта отсутствует атрибут "D". то это ещё не значит что он файл. Он может не существовать, либо быть объектом типа "Мой компьютер".
Посмотри функцию _FO_IsDir
 
Автор
ildar

ildar

Осваивающий
Сообщения
252
Репутация
29
AZJIO
Спасибо, не знал об этом. Хорошая штука, использую.


Добавлено:
Сообщение автоматически объединено:

Это весь код:
Код:
#include <Array.au3>
#include <FileOperations.au3>
#include <Constants.au3>
#include <Encoding.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListviewConstants.au3>
#include <GUIListBox.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

$aList = _List('computer OU=****,OU=****,DC=****,DC=**** -limit 200')
;_ArrayDisplay($aList)

$GUI = GUICreate("Копирование файлов или папок на компьютеры", 696, 450, 307, 232,-1,$WS_EX_ACCEPTFILES)

$List = GUICtrlCreateList("", 5, 5, 130, 400, BitOR($LBS_MULTIPLESEL, $GUI_SS_DEFAULT_LIST))
For $x = 1 To Ubound($aList)-1
       GUICtrlSetData($List, $aList[$x])
Next
$All = GUICtrlCreateCheckbox("Выбрать все", 5, 400, 130, 20)
$Btn = GUICtrlCreateButton("Копирование", 5, 420, 130, 25)
GUICtrlCreateLabel('Перенесите файлы или папки для копирования в это окно', 140, 5, 245, 150, $SS_LEFT)
$EditIN = GUICtrlCreateEdit("", 140, 35, 245, 200)
GUICtrlCreateLabel('Укажите полный путь, куда копировать, например: \SM2000\Report', 140, 240, 260, 30, $SS_LEFT)
$EditOUT = GUICtrlCreateInput("", 140, 270, 245, 20)
$myLog = GUICtrlCreateList("", 420, 35, 250, 380, $GUI_SS_DEFAULT_LIST + $LBS_NOINTEGRALHEIGHT)

GUICtrlSetState($EditIN,$GUI_DROPACCEPTED)
GUICtrlSetState($EditOUT,$GUI_DROPACCEPTED)

GUISetState(@SW_SHOW)

$sLogin =  InputBox("Проверка безопасности", "Введите логин.", "")
$sPasswords =  InputBox("Проверка безопасности", "Введите пароль.", "", "*")

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $All
      If BitAND(GUICtrlRead($All), $GUI_CHECKED) Then
        _GUICtrlListBox_SelItemRange($List, 0, _GUICtrlListBox_GetCount($List) - 1, True)
      Else
        _GUICtrlListBox_SelItemRange($List, 0, _GUICtrlListBox_GetCount($List) - 1, False)
      EndIf
    Case $Btn
        $sComp = _GUICtrlListBox_GetSelItemsText(ControlGetHandle($GUI, "", $List))
	    $sIN = GUICtrlRead($EditIN)
	    $sOUT = GUICtrlRead($EditOUT)
		$aIN = StringSplit($sIN, Chr(13), 1)
		 GUICtrlSetData($myLog, "")
		;_ArrayDisplay($aIN)

      If $sComp[0] = 0 Then
        MsgBox(0, "Внимание!", "Не выбраны адресаты")
	  ElseIf $aIN[0] = 1 Then
		MsgBox(0, "Внимание!", "Нет файлов для копирования")
	  Else
		  ProgressOn("Process", 'Идет копирование файлов', '',0,0,18)
		  For $i = 1 To $sComp[0]
			    DriveMapAdd("K:", "\\" & $sComp[$i] & "\c$", 0, $sComp[$i] & '\' & $sLogin, $sPasswords)
			    For $a = 1 to $aIN[0] - 1
					$scale = $i / 67 * 100
					ProgressSet( $scale, $aIN[$a] & '==>' & $sComp[$i])
					;MsgBox(0, '', $aIN[$a])
					$sTmp = _FO_IsDir($aIN[$a])
					If Not (@error Or $sTmp) Then
                                $Error = FileCopy($aIN[$a], 'K:' & $sOUT & '\', 1)
							ElseIf $sTmp Then
                                $Error = DirCopy($aIN[$a], 'K:' & $sOUT, 1)
							Else
								MsgBox(0, '', 'Ошибка файла или папки')
                            EndIf
					if $Error = 1 then
                              $num = "копирование успешно"
                         Else
						      $num = "копирование не успешно"
					EndIf
				Next
				DriveMapDel("K:")
				GUICtrlSetData($myLog, $sComp[$i] & ' - ' & $num)
			Next
			ProgressSet( 100, "Готово")
			Sleep(1000)
			ProgressOff()
	  EndIf
    Case $List
      GUICtrlSetState($All, $GUI_UNCHECKED)
  EndSwitch
Until 0


Func _List($sCommand)

    $sRead=""
 
   $iPID = Run(@ComSpec & ' /C dsquery ' & $sCommand , '', @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)

    If Not $iPID Then
        MsgBox(16, 'Error', 'Error')
        Exit
    EndIf

    While 1
        $sRead &= StdoutRead($iPID)
        ;$sRead = _Encoding_866To1251($sRead)
        If @error Then ExitLoop

        Sleep(10)

        ;ConsoleWrite($sRead)
        $aRead = StringSplit ($sRead,'"',3)

    WEnd

    ;ConsoleWrite(_Encoding_866To1251($sRead))

	$aSize = (UBound($aRead)+1)/2

	;MsgBox(16, 'Error', $aSize)

	Dim $aERead[$aSize]

    $count=1
    FOR $i=1 to UBound($aRead)-1 Step 2

         $sText = _Encoding_866To1251($aRead[$i])
		 $sPattern = '=\s*([\s?A-Za-z0-9А-Яа-я]+)'
		 $aResult = StringRegExp($sText, $sPattern, 1)
		 $aERead[$count] = $aResult[0]
		 $count=$count+1

    next
	Return $aERead

   _ArrayDisplay($aERead)

EndFunc
AZJIO Сделал по твоему совету проверку функцией FO_IsDir. И действительно начиная с со второй ячейки массива идет ошибка, хотя через MsgBox путь вижу нормальный. В чем засада?


Добавлено:
Сообщение автоматически объединено:

Победил чисткой от пробелов
Код:
For $a = 1 to $aIN1[0] - 1
	         $aIN[$a] = StringStripWS($aIN1[$a], 3)
        Next
 
Верх