出産前後の痔にはご注意!

FileCopyステートメントがありますが、FileCopyステートメントで大きなファイルをコピーしたり、ネットワーク上の別のPCにコピーしたりするとします。
コピーされた後のファイルをさらにコピーしたいのですが、コピーが完全に終了していないせいか、うまく動作しません。
ファイルのコピーが完全に終わったと検知する方法があるのでしょうか?
また、ファイルの削除に関しても同様に、完全に削除し終えたと検知する方法があるのでしょうか?
どなたか知っておられる方がおられましたらよろしくお願い致します。
FileCopyやKillなどのステートメントにはこだわっていません。
APIなどでもかまいませんのでよろしくお願い致します。

A 回答 (1件)

FileCopyやKillが、実際の処理を終了する前に戻っているという主張は、にわかには信じられません。

どうしてもプログラム自体に問題があるのではないかと考えてしまいます。

現在正常に動作しないそのプログラムで、FileCopyやKillを行った後にMsgBox等を入れて十分に待てば正常に動作するのでしょうか。まずはそこから確かめてみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
言い忘れていたことがあり、FileCopyを行っているEXEをShellで呼び出していたため、EXEが終了しないまま次のコピーなどを行おうとして処理がうまくいかなかったようです。
ありがとうございました。

お礼日時:2005/07/06 18:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルを処理中に次の処理に移ってしまうようなのですが、、

VB.NETですが、
趣味でアプリケーションを作成しています。
下記のコードで処理を実行させています。

Call Shell("C:\aaa.exe c:\test.txt c:\test2.txt", AppWinStyle.Hide)

(A)

Dim sr As New System.IO.StreamReader("c:\test2.txt", System.Text.Encoding.Default)
Dim sb As New System.Text.StringBuilder(CInt(Microsoft.VisualBasic.FileSystem.FileLen("c:\test2.txt") * 1.1))

'ファイルの最後までループ
Do Until sr.Peek = -1
sb.Append(sr.ReadLine & vbCrLf)
Loop
sr.Close()


"aaa"はtest.txtを加工してtest2.txtとして出力するプログラムです。
その後、test2を最後まで読み出しているのですが、
どうもプログラムaaaが処理を終了する前に
次の読み出し処理に移ってしまっているようなのです。
そこで、素人なりに上記(A)の部分に

For i = 0 To 2000000000
Next
For i = 0 To 2000000000
Next

とForループを加えて時間稼ぎしているのですが、
状況によって時間稼ぎがうまくいかない場合があります。どのように問題を回避すべきでしょうか?
aaaはDLLでも組み込み可能になっているプログラム
なのですがDLLで実行させると何らかのメリット
があるのでしょうか?
その点を教えていただけると助かります。
回答よろしくお願いいたします。

VB.NETですが、
趣味でアプリケーションを作成しています。
下記のコードで処理を実行させています。

Call Shell("C:\aaa.exe c:\test.txt c:\test2.txt", AppWinStyle.Hide)

(A)

Dim sr As New System.IO.StreamReader("c:\test2.txt", System.Text.Encoding.Default)
Dim sb As New System.Text.StringBuilder(CInt(Microsoft.VisualBasic.FileSystem.FileLen("c:\test2.txt") * 1.1))

'ファイルの最後までループ
Do Until sr.Peek = -1
sb.Append(sr.ReadLine & vbCrLf)
Loop
sr.Close()...続きを読む

Aベストアンサー

Dim hProc As System.Diagnostics.Process

'プロセス作成
hProc = System.Diagnostics.Process.Start("C:\aaa.exe c:\test.txt c:\test2.txt")
'プロセス終了待機
hProc.WaitForExit()
hProc.Close()
hProc.Dispose()

Dim sr As New System.IO.StreamReader("c:\test2.txt", System.Text.Encoding.Default)
Dim sb As New System.Text.StringBuilder(CInt(Microsoft.VisualBasic.FileSystem.FileLen("c:\test2.txt") * 1.1))

'ファイルの最後までループ
Do Until sr.Peek = -1
sb.Append(sr.ReadLine & vbCrLf)
Loop
sr.Close()

これでどうでしょうか。

Dim hProc As System.Diagnostics.Process

'プロセス作成
hProc = System.Diagnostics.Process.Start("C:\aaa.exe c:\test.txt c:\test2.txt")
'プロセス終了待機
hProc.WaitForExit()
hProc.Close()
hProc.Dispose()

Dim sr As New System.IO.StreamReader("c:\test2.txt", System.Text.Encoding.Default)
Dim sb As New System.Text.StringBuilder(CInt(Microsoft.VisualBasic.FileSystem.FileLen("c:\test2.txt") * 1.1))

'ファイルの最後までループ
Do Until sr.Peek = -1
sb.Append(sr.Read...続きを読む

Q大量のファイルのコピー完了の確認方法

サーバーから約6時間ほど? 掛けて90GB以上のファイルのコピーをしました。
ですが、コピー完了のお知らせみたいな物も無く、何時の間にか完了していました。

そこで質問ですが、コピーが完全に完了したか、又は途中で終わってしまったかを確認する方法を教えてください。
OSは、Windows 7 Professionalです。

なお、ファイルの中にはWordやExcel等が入っていますが、PCの中には、Microsoft Officeや、Word/Excel/PowerPoint/Outlook等は一切入っておりません。

よろしくお願いします。

Aベストアンサー

元ファイルと、コピー後のファイルについて、
そのファイル数と、ファイル容量が同じなら、それで良いのでは?

もしくは、改めて、コピーを実行しましょう。
専用のコピーツールがいくつか用意されています。

http://nextar.eshizuoka.jp/e993034.html

http://amaotolog.com/backup/entry187.html

QVBA zipファイルの作成

(1)作業環境
Windows 7 Professional SP1
Intel(R) Core(TM) i3­3240 CPU @ 3.40GHz 4.00GB
32ビットオペレーティングシステム
Microsoft Office Standard 2010
Excel ver.14


(2)やりたいこと
3つのファイルのzipファイルを同じフォルダに作成したい
  C:\temp\a.txt
  C:\temp\b.txt
  C:\temp\c.txt
  から
  C:\temp\d.zip
  を作りたい。


(3)状況
下記サイトを参照しましたが知識不足で正確にわからないのと、『本当にこんなに長いコードが必要なのか?』と疑問に思っています。

 参考①VBAでZIP圧縮する。
 http://scripting.cocolog-nifty.com/blog/2007/11/vbazip_a144.html

 参考②ファイル/フォルダをzipファイルに圧縮
 http://qiita.com/kou_tana77/items/72346c69107fabf99335

定義、ループ、分岐など基本的なことは分かっています。
APIやFSOなども詳しくはないですが、知っています。
たとえば①の「fso.*******」、「Shell.*******」などの、*******が分かりません。


(4)質問事項
余計なものは除いて必要最低限のコードだけにするとどのようになるかしりたいです。
※エラー処理などに関しては使用環境にあわせて作成します。


ご存じの方ご教示くださいm(_ _)m

(1)作業環境
Windows 7 Professional SP1
Intel(R) Core(TM) i3­3240 CPU @ 3.40GHz 4.00GB
32ビットオペレーティングシステム
Microsoft Office Standard 2010
Excel ver.14


(2)やりたいこと
3つのファイルのzipファイルを同じフォルダに作成したい
  C:\temp\a.txt
  C:\temp\b.txt
  C:\temp\c.txt
  から
  C:\temp\d.zip
  を作りたい。


(3)状況
下記サイトを参照しましたが知識不足で正確にわからないのと、『本当にこんなに長いコードが必要なのか?』と疑問に思ってい...続きを読む

Aベストアンサー

こんな感じでしょうか?
・既に圧縮書庫ファイルが存在する場合は上書きされます。
・指定した被圧縮ファイルが存在しなかった場合はハングアップします。

-----------------------------
Sub MakeZip()
Dim sfo As Object, app As Object
Set sfo = CreateObject("Scripting.FileSystemObject")
Set app = CreateObject("Shell.Application")

Dim zipFolder As Object
Dim file As Variant
Dim count As Long

Const zipFile = "C:\excel\圧縮.zip" '圧縮書庫ファイルの絶対パス
Dim files As Variant
files = Array("C:\excel\あ.txt" _
, "C:\excel\い.txt" _
, "C:\excel\う.txt") ' 圧縮するファイルの絶対パス

'空のzipファイルを作成する
With sfo.CreateTextFile(zipFile, True)
.Write "PK" & Chr(5) & Chr(6) & String(18, 0)
.Close
End With
Set zipFolder = app.Namespace(sfo.GetAbsolutePathName(zipFile))

'zipファイルに圧縮対象のファイルをコピーする
count = 0
For Each file In files
count = count + 1
zipFolder.CopyHere (sfo.GetAbsolutePathName(CStr(file)))
'このファイルのコピーが終わるまで待つ。
Do Until zipFolder.Items().count = count
Application.Wait Now + TimeSerial(0, 0, 1)
Loop
Next
Set sfo = Nothing
Set app = Nothing
Set zipFolder = Nothing
End Sub

こんな感じでしょうか?
・既に圧縮書庫ファイルが存在する場合は上書きされます。
・指定した被圧縮ファイルが存在しなかった場合はハングアップします。

-----------------------------
Sub MakeZip()
Dim sfo As Object, app As Object
Set sfo = CreateObject("Scripting.FileSystemObject")
Set app = CreateObject("Shell.Application")

Dim zipFolder As Object
Dim file As Variant
Dim count As Long

Const zipFile = "C:\excel\圧縮.zip" '圧縮書庫ファイルの絶...続きを読む

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

Qエクセル マクロで指定フォルダを開く

エクセルにて
指定フォルダを開く、マクロがあれば教えて頂けないでしょうか。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

こういうものですか?
開くフォルダを変えたいときは targ に与えるパスを変更します。

Sub OpenFolders()
Dim targ As String
targ = "C:\"
Shell "C:\Windows\Explorer.exe " & targ, vbNormalFocus
End Sub

QVBAにおいて、ファイルの移動にMoveFileを使っていますが、

VBAにおいて、ファイルの移動にMoveFileを使っていますが、
移動先に移動元と同じ名前が存在する時、エラーが発生してしま
います。これを回避して、移動することはできないのでしょうか。
(移動先に移動元と同じ名前が存在しても、上書きで移動。)
また、MoveFile以外の方法はないのでしょうか。
教えて下さい。

Aベストアンサー

こんにちは
#1のHirorin_20さんと同意見です。

方法1:
dir関数で、同名Fileのチェック
あれば削除

方法2:
On Error Resume Next
Kill パス&ファイル名
On Error GoTo 0

ただし、どちらの場合でも、対象のファイルが開いているなど、Windowsがロックしている場合には対応できません。

QVBAでCSVファイルが使用中かどうかの確認

お世話になっております。

Excel VBA についてご質問します。
今、VBAでCSVファイルを作成してデータ管理を行うソフトを作成しております。
このソフトは、共有をかけて複数の人で使用するため同じCSVファイルに同時にアクセスする可能性があります。そのため、CSVファイルに混同したデータが書き込まれてしまう恐れがあります。
そこで、CSVファイルがオープン中または、アクセス中が認識できる命令等はないでしょうか?

よろしくお願いします。

Aベストアンサー

こんにちは。

CSV ファイルですか....難しいですよ。

Excel で CSV を開く場合、ファイルはロックされるため、下記のような
ロジックで使用中かどうかを調べることは可能です。

' // ファイルが使用中か調べる
Public Function FileInUse(ByVal sFilename As String) As Boolean

  Dim n As Integer
  n = FreeFile()
  On Error Resume Next
  Open sFilename For Binary Lock Read Write As #n
  FileInUse = CBool(Err.Number > 0)
  Close #n
  On Error GoTo 0

End Function

ただし、これは CSV を編集するアプリが、ファイルを開くときに、
ファイルをロックする、、これが条件です。ロックされないファイル
について、使用中かどうかを判定する術はありません。

CSV は Excel で編集すると限定できる場合は、このロジックで十分です。

しかし、CSV の実態は単純なテキストですから、メモ帳などでも編集
できますよね?
メモ帳(他多くのエディタ)では、ファイルがロックがされませんから、
このケースでは検知できません。

心配ならデータベース(例えば mdb とか)を使った方がよろしいのでは?

こんにちは。

CSV ファイルですか....難しいですよ。

Excel で CSV を開く場合、ファイルはロックされるため、下記のような
ロジックで使用中かどうかを調べることは可能です。

' // ファイルが使用中か調べる
Public Function FileInUse(ByVal sFilename As String) As Boolean

  Dim n As Integer
  n = FreeFile()
  On Error Resume Next
  Open sFilename For Binary Lock Read Write As #n
  FileInUse = CBool(Err.Number > 0)
  Close #n
  On Error GoTo 0

End Fun...続きを読む

QVBA モジュールで共通に使う変数の宣言方法

VBAにてプログラミングを覚えている者です。

現在、いくつかのモジュールがあり、それぞれDimにて宣言している共通の変数があります。
いくつものプロシージャに毎回宣言せず、どこかでひとまとめにしたいと思い、色々と調べています。

例えば、

Dim pic1 As Picture
Dim cell1 As String
Dim pass1 As String
Dim pic2 As Picture

などです。


Dimのほかに、Publicの宣言などがありますが、いま一つ使い方がピンときません。

共通宣言する変数をひとつのモジュールとして登録し、活用できると、いざ変更となったときに
その内容だけ置き換えればいいと思うのですが、みなさんはどのように宣言をしていますか?
(例えば、Stringなどは各モジュールで変更するのが大変だと思うのですが・・・)

ヒントを教えていただければと思います。よろしくお願いします。

Aベストアンサー

>モジュールで共通に使う変数の宣言方法

モジュールの先頭に書いたdimで宣言すると,そのモジュールの中だけ(に記入されている各プロシジャ)でパブリックになります。
モジュールの先頭に書いたpublicで宣言すると,全モジュール(に記入されている各プロシジャ)に対してパブリックになります。

「変数宣言モジュール」のようにモジュールを越えて参照させたいという事なので,DimではなくPublicで宣言します。


Module1:
public x as variant


Module2:
sub macro1() ’先に実行する
x = "abc"
end sub


Module3:
sub macro1()
msgbox x
end sub

QDir関数で読み取り順を操作できる?

あるフォルダ内のファイルを名前順で読みたいのですが、
読み取り順を操作することは可能ですか?

Aベストアンサー

こんにちは
#1,#2さんのとおりそのままではできないと思います。
私はファイル名で並べ替えるときは、Sorted=Trueにした「リストボックス」にAdditemしていって、取得してからIndex順に読みます。
ファイル名を取得するロジックはサンプルにあったと思います。
ちなみにサイズや更新日順の場合は配列に入れてソートするようにしています。
では!


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング