Member 13106469 Ответов: 0

Как я могу программировать (VB.NET) чтобы скопировать файлы из папки в другую, файлы, перечисленные в xlsx


Всем привет,

Я не разработчик и новичок в VBS, мое требование состоит в том, что у меня есть лист excel с именами 3K + имя файла, чтобы скопировать их из папки в другую, только 5 в то время, пока эти 5 файлов не будут обработаны сервером, а затем обновить список.

Я написал VBscript, который может читать filelist1 (txt ) с 5 именами файлов внутри и копировать их из источника в пункт назначения , а затем регистрировать скопированные файлы или сбой. затем проверьте папку назначения, если в ней есть файлы, подождите 2 минуты, если в ней нет файлов, начните копировать файлы из filelist2, а затем протоколируйте процесс.

последнее, скопируйте файл журнала в папку журнала с отметкой времени в названии :) вот и все, извините за то, что многое объясняю.

1-Есть ли какой-либо другой способ облегчить мою жизнь вместо того, чтобы заполнять список файлов 2 снова и снова ?
что-то вроде открытия листа excel, чтения 5 имен из столбца A, затем копирования из src в dest и записи скопированного в B ??

2-Мне нужен индикатор выполнения, который показывает передачу в реальном времени, как копирование windows ( я думаю, VBS не может этого сделать).

3-Могу ли я преобразовать его в VB.net так что у меня может быть настроение GUI, очень простое, как "Нажмите здесь, чтобы скопировать 5 файлов и индикатор выполнения под кнопкой "

Спасибо всем заранее

Что я уже пробовал:

Dim objFSO, objShell, WSHshell, objFolder, objFolderItem
Dim objFLD
Dim objFileList, strFileToCopy, strSourceFilePath, strTargetFilePath, strLogFile
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
Set WSHshell = CreateObject("WScript.Shell")
Set fld = objFSO.GetFolder("\\ajdoh5bics01\ajmn_share\AJA\AJA_Manual_Archive\")
Const ForReading = 1, ForWriting = 2, ForAppending = 8

' On Error Resume Next
Do Until fld.Files.Count = 0

If fld.Files.Count = 0 Then
     MsgBox "Cool. Diva Watch Folder is Empty. Press Okay to continue"

Else
    MsgBox "Diva Watch Folder is Not Empty, will wait for 2 Min"

Wscript.sleep 120000 'pause 1 Min 

End If
loop
 
msgBox " This process will copy the files in the file list 1. " & strFileList1 & " Do you want to proceed ?"


' The list of files to copy. Should be a text file with one file on each row. No paths - just file name.
Const strFileList1 = "\\aja-mm\nas\Manaf\Diva Migration\filelist1.txt"
Const strFileList2 = "\\aja-mm\nas\Manaf\Diva Migration\filelist2.txt"

' Should files be overwriten if they already exist? TRUE or FALSE.
Const blnOverwrite = FALSE

' Make a log file and/or clear it's contents
strLogFile = "\\aja-mm\nas\Manaf\Diva Migration\Temp-Diva.log" ' & "Temp-Diva.log"
Dim objLogFile
Set objLogFile = objFSO.OpenTextFile(strLogFile, ForWriting, True)
objLogFile.WriteLine ""

' Get the source path for the copy operation.
Const strSourceFolder = "\\ajdoh5bics01\ajmn_share\AJA\AJA TX Archive DO NOT DELETE\"

' Get the target path for the copy operation.
Const strTargetFolder = "\\ajdoh5bics01\ajmn_share\AJA\AJA_Manual_Archive\"


Set objFileList = objFSO.OpenTextFile(strFileList1, ForReading, False)

Dim strResults, iSuccess, iFailure
iSuccess = 0
iFailure = 0

On Error Resume Next
Do Until objFileList.AtEndOfStream
    ' Read next line from file list and build filepaths
    strFileToCopy = objFileList.Readline
    strSourceFilePath = objFSO.BuildPath(strSourceFolder, strFileToCopy)
    strTargetFilePath = objFSO.BuildPath(strTargetFolder, strFileToCopy)
    ' Copy file to specified target folder.
    Err.Clear
    objFSO.CopyFile strSourceFilePath, strTargetFilePath, blnOverwrite
    If Err.Number = 0 Then
        ' File copied successfully
        iSuccess = iSuccess + 1
	objLogfile.WriteLine "Copied   " & strFileToCopy
        If Instr(1, Wscript.Fullname, "cscript.exe", 1) > 0 Then
            ' Running cscript, output text to screen
            Wscript.Echo strFileToCopy & " copied successfully"
        End If
    Else
        ' Error copying file
        iFailure = iFailure + 1
        TextOut "Error " & Err.Number & " (" & Err.Description & ") trying to copy " & strFileToCopy
objLogfile.WriteLine "Failed   " & strFileToCopy
    End If
Loop

strResults = strResults & vbCrLf
strResults = strResults & iSuccess & " files copied successfully." & vbCrLf
strResults = strResults & iFailure & " files generated errors" & vbCrLf
Wscript.Echo strResults

Sub TextOut(strText)
    If Instr(1, Wscript.Fullname, "cscript.exe", 1) > 0 Then
        ' Running cscript, use direct output
        Wscript.Echo strText
    Else
        strResults = strResults & strText & vbCrLf
    End If
End Sub
'''''''''''''''''''''''
'''''''''''''''''''''''''
'''''''''''''''''''''''''
''''''''''''''''''''''''
' line 82
' Wscript.sleep 60000 'pause 1 Min 

On Error Resume Next
Do Until fld.Files.Count = 0

If fld.Files.Count = 0 Then
     MsgBox "Diva Watch Folder is Empty. Press Okay to continue"

Else
    MsgBox "Diva Watch Folder is Not Empty, will wait for 2 Min"

Wscript.sleep 120000 'pause 1 Min 

End If
loop



msgBox " This process will copy the files in the file list 2. " & strFileList2 & " Do you want to proceed ?"


' The list of files to copy. Should be a text file with one file on each row. No paths - just file name.

Const ForReading2 = 2

Set objFileList = objFSO.OpenTextFile(strFileList2, ForReading, False)

iSuccess = 0
iFailure = 0
On Error Resume Next
Do Until objFileList.AtEndOfStream
    ' Read next line from file list and build filepaths
    strFileToCopy = objFileList.Readline
    strSourceFilePath = objFSO.BuildPath(strSourceFolder, strFileToCopy)
    strTargetFilePath = objFSO.BuildPath(strTargetFolder, strFileToCopy)
    ' Copy file to specified target folder.
    Err.Clear
    objFSO.CopyFile strSourceFilePath, strTargetFilePath, blnOverwrite
    If Err.Number = 0 Then
        ' File copied successfully
        iSuccess = iSuccess + 1
	objLogfile.WriteLine "Copied   " & strFileToCopy
        If Instr(1, Wscript.Fullname, "cscript.exe", 1) > 0 Then
            ' Running cscript, output text to screen
            Wscript.Echo strFileToCopy & " copied successfully"
        End If
    Else
        ' Error copying file
        iFailure = iFailure + 1
        TextOut "Error " & Err.Number & " (" & Err.Description & ") trying to copy " & strFileToCopy
	objLogfile.WriteLine "Failed   " & strFileToCopy
    End If
Loop

strResults = strResults & vbCrLf
strResults = strResults & iSuccess & " files copied successfully." & vbCrLf
strResults = strResults & iFailure & " files generated errors" & vbCrLf
Wscript.Echo strResults

Sub TextOut(strText)
    If Instr(1, Wscript.Fullname, "cscript.exe", 1) > 0 Then
        ' Running cscript, use direct output
        Wscript.Echo strText
    Else
        strResults = strResults & strText & vbCrLf
    End If
End Sub

'''''''''''''''''''''''
'''''''''''''''''''''''''
'''''''Send the log file to logs folder''''''''''''''''''
''''''''''''''''''''''''
Dim sSourceFolder
Dim sDestFolder
Dim sDBFile
Dim sDateTimeStamp
Const OVER_WRITE_FILES = True

sSourceFolder = "\\aja-mm\nas\Manaf\Diva Migration\"
sBackupFolder = "\\aja-mm\nas\Manaf\Diva Migration\logs"
sDBFile = "Temp-Diva"
sDBFileExt = "log"
sDateTimeStamp = cStr(Year(now())) & _
                 Pad(cStr(Month(now())),2) & _
                 Pad(cStr(Day(now())),2) & _
                 Pad(cStr(Hour(now())),2) & _
                 Pad(cStr(Minute(now())),2) & _
                 Pad(cStr(Second(now())),2)

'If the backup folder doesn't exist, create it.
If Not objFSO.FolderExists(sBackupFolder) Then
    objFSO.CreateFolder(sBackupFolder)
End If

'Copy the file as long as the file can be found
If objFSO.FileExists(sSourceFolder & "\" & sDBFile & "." & sDBFileExt) Then
    objFSO.CopyFile sSourceFolder & "\" & sDBFile & "." & sDBFileExt,_
                    sBackupFolder & "\" & sDBFile & "_" & sDateTimeStamp & "." & sDBFileExt,_
                    OVER_WRITE_FILES
End if

Set objFSO = Nothing



Function Pad(CStr2Pad, ReqStrLen)

    Dim Num2Pad
 
    Pad = CStr2Pad
    If len(CStr2Pad) < ReqStrLen Then
        Num2Pad = String((ReqStrlen - Len(CStr2Pad)), "0")
        Pad = Num2Pad & CStr2Pad
    End If
End Function

Garth J Lancaster

Конечно, вы можете сделать это в VB.Net - я не знаю, в чем ваша проблема (Ы) и что вас останавливает - вы, кажется, хорошо разбираетесь в "процессе", нет никаких причин, почему вы не можете писать в VB

Я бы предложил вам

а) найдите хороший базовый праймер по VB.Net формы
б) подумайте о том, какую функциональность вы хотите "выгнать" из VB.Net "GUI", и начать просто / постепенно - например
b1) просто кнопка "Пуск" и текстовое поле на форме, сделайте копию на "событии" нажатия кнопки "Пуск", обновите текстовое поле, чтобы сказать "x элементов сделано", начните с фиксированного / консервированного # вещей для копирования
b2) добавьте средство выбора файла, чтобы выбрать электронную таблицу, и, возможно, linqtoexcel, чтобы прочитать ее, отвесите это в обработчик кнопки запуска ' b1
b3) возможно, переместить копию на "фоновый" рабочий с возможностью отмены
b4) добавьте окно прогресса в форму и отвесьте его, чтобы получать обновления от фонового рабочего

ваш выбор элементов b1-b4 и выше, очевидно, будет зависеть от вашего опыта и скорости обучения, другие будут делать это по-другому, но если вы очень Новичок во всем этом, просить вас внедрить фонового работника, чтобы не заморозить ваш пользовательский интерфейс, - это довольно сложная задача (вот почему я также предлагаю начать с небольшого количества файлов, вы можете увеличить их количество, пока не достигнете болевой точки-замораживания пользовательского интерфейса или увеличения ваших знаний и т. д.)

как и в большинстве других вещей, вы обнаружите, что разбить его на куски / кусочки размером с укус - это правильный путь, и не бойтесь использовать карандаш и бумагу для рисования графического интерфейса (или инструменты проволочного каркаса и т. д.), чтобы спланировать его перед началом.

0 Ответов