tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル使用中のファイルを削除(移動)する方法
記事No6604
投稿日: 2007/12/04(Tue) 17:41
投稿者mathar
VB初心者です。VB2005で写真編集アプリを作成しています。
PictureBoxに表示したjpgファイルを名前を変えて移動する処理をしたいのですが、
「ファイルが使用中・・・」メッセージにより実行出来ません。
PictureBoxに画像ファイルを表示した状態で以下のように書いてます。

fs = New System.IO.FileStream(C:\1.jpg,IO.FileMode.Open,IO.FileAccess.Read)
PictureBox1.Image = System.Drawing.Image.FromStream(fs)
fs.Close()
System.IO.File.Move(C:\1.jpg, C:\2.jpg)

どなたか宜しくお願いします。

[ツリー表示へ]
タイトルRe: 使用中のファイルを削除(移動)する方法
記事No6605
投稿日: 2007/12/04(Tue) 19:44
投稿者花ちゃん
> 「ファイルが使用中・・・」メッセージにより実行出来ません。
別に問題なく実行できますが?


> PictureBoxに画像ファイルを表示した状態で以下のように書いてます。

まさか、下記のそのままと言う事はないですよね?
実際に使っているコードをペーストして投稿するようにして下さい。

[ツリー表示へ]
タイトルRe^2: 使用中のファイルを削除(移動)する方法
記事No6606
投稿日: 2007/12/04(Tue) 21:21
投稿者mathar
花ちゃん さん ご回答ありがとうございます。
> 実際に使っているコードをペーストして投稿するようにして下さい。
かなり省略してしまいました。すいません。
選択したフォルダ内の全てのjpgファイルをリストボックスに表示し、SelectedIndexを変更して
PictureBoxに画像表示。TextBoxを配置した別のFormを表示させ、BtnClickイベント

Private Sub BtnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOK.Click

Dim bmp As New System.Drawing.Bitmap(imgFile)
Nitiji = Text年.Text + 1988 & ":" & Text月.Text & ":" & Text日.Text & " " & Text時.Text & ":" & Text分.Text & ":" & Text秒.Text

Dim i As Integer
  For i = 0 To bmp.PropertyItems.Length - 1
    Dim pi As System.Drawing.Imaging.PropertyItem = bmp.PropertyItems(i)
       If pi.Id = &H132 Or pi.Id = &H9003 Or pi.Id = &H9004 And pi.Type = 2 Then
          pi.Value = System.Text.Encoding.ASCII.GetBytes( _
          Nitiji + ControlChars.NullChar)
          pi.Len = pi.Value.Length
          bmp.SetPropertyItem(pi)
       End If
  Next i
Dim File_Name As String = System.IO.Path.GetFileName(imgFile)
Dim FullPath As String = "D:\ChangeFile\" & File_Name
bmp.Save(FullPath, System.Drawing.Imaging.ImageFormat.Jpeg)
bmp.Dispose()
'ここまでは出来ます。
Dim fs As System.IO.FileStream
        fs = New System.IO.FileStream(imgFile, IO.FileMode.Open, IO.FileAccess.Read)
        Me.Picture1.Image = System.Drawing.Image.FromStream(fs)
        fs.Close()
        Dim fi As New System.IO.FileInfo(imgFile)

        Try
            fi.Delete()'ここで必ずエラーとなります。
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
End Sub
別フォルダに保存までは出来るのですが、
元ファイルの削除・移動・名前変更が一切出来ません。
宜しくお願いします。

[ツリー表示へ]
タイトルRe^3: 使用中のファイルを削除(移動)する方法
記事No6607
投稿日: 2007/12/04(Tue) 22:52
投稿者花ちゃん
>             fi.Delete()'ここで必ずエラーとなります。

エラーがでるなら、どのようなエラー内容かを書いて下さい。
ファイルが使用中・・のエラーがでるなら、ファイルが使用中 だからでは。
imgFile はどのようになっているのですか?

多分、最初の処理の部分(未掲載の部分)でファイルをロック(使用中)しているかと
思うので、一度最初の部分等をコメントにして確認してみて下さい。

又、せっかくのコードなので動作確認できるようにするとこちらでも確認できるし
コメントが入っていると何をやりたい(やろうとしているのか)のかが掴めるのですが

ファイルのタイムスタンプを書き変えたいなら他の方法を試してみるとか。

[ツリー表示へ]
タイトルRe^4: 使用中のファイルを削除(移動)する方法
記事No6612
投稿日: 2007/12/05(Wed) 20:12
投稿者mathar
花ちゃんさん・スクリプトプログラマさん ご回答ありがとうございます。
> ファイルが使用中・・のエラーがでるなら、ファイルが使用中 だからでは。
> imgFile はどのようになっているのですか?
Dim imgFile As String = Me.List1.Text 'ピクチャーボックスに表示したjpgファイルのフルパス
> 多分、最初の処理の部分(未掲載の部分)でファイルをロック(使用中)しているかと
> 思うので、一度最初の部分等をコメントにして確認してみて下さい。
bmp.Dispose() これでロック解除出来ていると思うのですが・・・
> 又、せっかくのコードなので動作確認できるようにするとこちらでも確認できるし
> コメントが入っていると何をやりたい(やろうとしているのか)のかが掴めるのですが
> Dim i As Integer
>   For i = 0 To bmp.PropertyItems.Length - 1
>     Dim pi As System.Drawing.Imaging.PropertyItem = bmp.PropertyItems(i)
'Exif情報から日付関係を探す
>        If pi.Id = &H132 Or pi.Id = &H9003 Or pi.Id = &H9004 And pi.Type = 2 Then
'値を変更する
>           pi.Value = System.Text.Encoding.ASCII.GetBytes( _
>           Nitiji + ControlChars.NullChar)
>           pi.Len = pi.Value.Length
'設定する
>           bmp.SetPropertyItem(pi)
>        End If
>   Next i
> Dim File_Name As String = System.IO.Path.GetFileName(imgFile)
> Dim FullPath As String = "D:\ChangeFile\" & File_Name
'"D:\ChangeFile\" & File_Name へ保存する
> bmp.Save(FullPath, System.Drawing.Imaging.ImageFormat.Jpeg)
> bmp.Dispose()
> 'ここまでは出来ます。

FileStreamオブジェクトを使用して画像のロックを解除
> Dim fs As System.IO.FileStream
>         fs = New System.IO.FileStream(imgFile, IO.FileMode.Open, IO.FileAccess.Read)
>         Me.Picture1.Image = System.Drawing.Image.FromStream(fs)
>         fs.Close()
>         Dim fi As New System.IO.FileInfo(imgFile)
>
>         Try
>             fi.Delete()'ここで必ずエラーとなります。
>         Catch ex As Exception
>             MessageBox.Show(ex.Message)
>         End Try
こんな感じです・・・。

> ファイルの削除はタイミングエラーが発生し得るものです。
> (エクスプローラが見に行ったりするので)
> 暫時置いて数回リトライしてみては。

何度かリトライしてみたら、なんと出来ました!!(する時で回数は変わります・・)
1回で削除・移動する方法など無いものですかね・・

[ツリー表示へ]
タイトルRe^5: 使用中のファイルを削除(移動)する方法
記事No6619
投稿日: 2007/12/06(Thu) 22:25
投稿者スクリプトプログラマ
うまく行ってよかったですね。

ところで、そのエラーが発生するとき、
エクスプローラでそのファイルのフォルダを開いています?

[ツリー表示へ]
タイトルRe^6: 使用中のファイルを削除(移動)する方法
記事No6636
投稿日: 2007/12/07(Fri) 18:55
投稿者mathar
スクリプトプログラマさん 返信ありがとうございます。

> ところで、そのエラーが発生するとき、
> エクスプローラでそのファイルのフォルダを開いています?

エクスプローラは開いてない状態でやっています。

[ツリー表示へ]
タイトルRe^7: 使用中のファイルを削除(移動)する方法
記事No6637
投稿日: 2007/12/07(Fri) 19:35
投稿者スクリプトプログラマ
> エクスプローラは開いてない状態でやっています。

ということは、開いているのはエクスプローラじゃなさそう。

closeが非同期で遅延するとはあまり思えませんし。。。

[ツリー表示へ]
タイトルRe^8: 使用中のファイルを削除(移動)する方法
記事No6642
投稿日: 2007/12/08(Sat) 12:16
投稿者mathar
> ということは、開いているのはエクスプローラじゃなさそう。
>
> closeが非同期で遅延するとはあまり思えませんし。。。

開いてるファイルも無く、ファイル削除出来る時・出来ない時に規則性が有るわけでも無く・・・
VBのバグなのかそれとも・・・

地道に調べてみます。
ありがとうございました。

[ツリー表示へ]
タイトルRe^9: 使用中のファイルを削除(移動)する方法
記事No6686
投稿日: 2007/12/16(Sun) 16:30
投稿者スクリプトプログラマ
>> closeが非同期で遅延するとはあまり思えませんし。。。
Disposeが非同期で遅延してるのかも。

System.Drawing.Bitmap 削除で検索すれば、
http://vsug.jp/tabid/63/forumid/44/postid/8416/view/topic/Default.aspx
で、最初からロックを取らない方法にすればよいのでは。

[ツリー表示へ]
タイトルRe^3: 使用中のファイルを削除(移動)する方法
記事No6608
投稿日: 2007/12/05(Wed) 00:16
投稿者スクリプトプログラマ
ファイルの削除はタイミングエラーが発生し得るものです。
(エクスプローラが見に行ったりするので)
暫時置いて数回リトライしてみては。

[ツリー表示へ]