2016-09-13 21 views
1

私はsftpがファイルをダウンさせるコードを持っています。私はそれが完了したかどうかテストするログを読んでいます。私はそれがサイズが0kbより大きいかどうかを調べるためにファイルをテストします。これらのステップが完了したら、filesystemobjectを使用してファイルの名前を変更しようとします。VBA FTP:許可が拒否された後にファイル名を変更

'Wait for FTP to complete 
Do While Not (bSFTPDownloadComplete(strLogFile)) 
    Sleep 2000 
Loop 

'Wait for file to not be 0KB 
Do Until FileSize(strFile) > 0 
    Sleep 2000 
Loop 

'Move file to filename 
RenameFile strFile, strNewFile 

bSFTPDownloadCompleteは「合計ファイルがダウンロード:1」の内容とテストを読んでいる:以下のコードの抽出物(私は今まで、ここで一度に1ファイルをダウンロードしています)、これは正常に動作し、私は必要に応じて詳細に行くことができますが、私は本当にこれが問題だとは思わない。

Function FileSize(strPath As String) As Double 
Dim fso As FileSystemObject 

FileSize = 0 

Set fso = CreateObject("Scripting.FileSystemObject") 

If fso.FileExists(strPath) Then 
    FileSize = fso.GetFile(strPath).size 
End If 

Set fso = Nothing 
End Function 

でrenameFileは以下の通りである:次のよう


ファイルサイズである

Function RenameFile(strOrig As String, strNew As String) 
Dim fso As FileSystemObject 

Set fso = CreateObject("Scripting.FileSystemObject") 

fso.MoveFile strOrig, strNew 

Set fso = Nothing 
End Function 

オン非常に大きなファイルfso.MoveFile行でRun-Time 70 Permission Deniedエラーが発生します。 ftpログで完了し、ファイルのサイズが0より大きいというテストに合格しました。

もし私が数秒待っていれば、それでも問題はなく、コードは続行できます。私は本当に大きなファイルの潜在的可能性は、それはまだ壊れて、私は時間を無駄にすることを意味するので、数秒間スリープ状態にしたくない。

ファイルが別のプロセスでまだ使用されているかどうかをテストする方法はありますか?もし私が進むことができる唯一の方法は、err = 70の場合にスリープして再開するエラーハンドラを関数に入れることですが、これは私の頭には理想的ではないようです。

すべてのアイデアを喜んで受け取ります。

+0

ファイルを実際にダウンロードするために何を使用していますか?あなたはまだ実際のファイルのパーミッションをチェックしましたか? – Comintern

+0

私はCoreFTP via Shellコマンドを使用しています。それは 'strFTP =" C:¥Program Files¥CoreFTP¥coreftp.exe -s -delsrc -log C:¥Temp¥ftplog.txt -O -d sftp:// user:pwd @ server:port/filepath -pになります。 C:\ temp \ "(私はその文字列からいくつかのビットを置き換えた)、そして、' VBA.Shell strFTP、vbMinimizedNoFocus'。 –

+0

ウェブサイトから: "ビルド1437でcorecmd.exeというユーティリティが追加され、ブロック転送が可能になりました。転送が完了するまで転送がブロックされる同じコマンドラインパラメータを使用してください。"ブロック転送または非同期転送を使用していますか? – Comintern

答えて

0

いいえ、私はそれを持っています。代わりに、ファイルサイズにそれを基づかのcoreftp.exeはまだプロセスとして開いている場合は、私がチェックしています:

'Check for coreftp.exe to close - Command line should match strFTP 
Do While bCoreFTPRunning(strFTP) 
    Sleep 2000 
Loop 

次のように使用する機能は次のとおりです。

Function bCoreFTPRunning(strFTP As String) As Boolean 
Dim objWMIService, colProcessList, objProcess, i As Integer 

bCoreFTPRunning = False 

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 

Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'coreftp.exe'") 

For Each objProcess In colProcessList 
If Replace(objProcess.commandline, Chr(34), "") = strFTP Then 
    bCoreFTPRunning = True 
End If 
Next 

Set objWMIService = Nothing 
Set colProcessList = Nothing 
End Function 

プロセスでコマンドラインがありますすでにstrFTPとして用意されているものと同じです(別に二重引用符を追加しています)。

関連する問題