C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: 画像の振り分け方法に関して


(過去ログ 100 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■59784 / inTopicNo.1)  画像の振り分け方法に関して
  
□投稿者/ TN (5回)-(2011/06/07(Tue) 10:52:23)

分類:[.NET 全般] 

お世話になります。

現在、Visual Basic 2010にて画像の振り分けソフトを作製しているところです。

作製したいソフトの内容として、

「他のソフトより任意のフォルダに保存されてくる画像を、VBで作製したソフトを利用して別フォルダに移動させる」

のが目標です。


現状は、Timerを利用して、1ms間隔で元フォルダを監視させて、ファイルが入ってきたら即移動させるように
プログラムを作製しているのですが、下記のエラー文がでてしまいます。

「ファイルが別のプロセスで使用されているため、プロセスはファイルにアクセスできません。」


恐らくですが、別ソフトが画像を保存している最中に、VBで作製したソフトがファイルを移動させようとして
しまっていると思うのですが、どう対応すれば良いのかが分かりません。


改善策がありましたら、ご教示のほど宜しくお願い致します。



引用返信 編集キー/
■59785 / inTopicNo.2)  Re[1]: 画像の振り分け方法に関して
□投稿者/ shu (761回)-(2011/06/07(Tue) 11:06:17)
No59784 (TN さん) に返信

> 「ファイルが別のプロセスで使用されているため、プロセスはファイルにアクセスできません。」
この例外が発生してから少し待ちを入れてから処理をするのはどうですか?


引用返信 編集キー/
■59791 / inTopicNo.3)  Re[2]: 画像の振り分け方法に関して
□投稿者/ おのでら (5回)-(2011/06/07(Tue) 12:17:15)
おのでら さんの Web サイト
2011/06/07(Tue) 12:18:03 編集(投稿者)

解決策じゃなくただの情報なんですがフォトショップなんかだとファイルを開いているだけでファイルのアクセス権をにぎり続ける場合があるのでそこらへんも考慮が必要ですね。(要はファイルを保存してもファイルを閉じない限りはファイルにアクセスできない場合がある)

※なんか「Photoshop」(←半角)と打つとスパム判定受けますね orz
引用返信 編集キー/
■59794 / inTopicNo.4)  Re[3]: 画像の振り分け方法に関して
□投稿者/ TN (6回)-(2011/06/07(Tue) 13:40:32)
みなさんご回答ありがとうございます!

試しに振り分け前に待ち時間(System.Threading.Thread.Sleep(***))を設けてみたところ
振り分けができるようになりました。
ありがとうございます。

ソフトによっては、アクセス権をにぎり続けられる場合もあるんですね。
勉強になります。

製作中のソフトに関してですが、少し問題点も残っています。
現在待ち時間を200ms程度設けているのですが、動作が不安定でまれに先ほどと同様の

「ファイルが別のプロセスで使用されているため、プロセスはファイルにアクセスできません。」

が現れてしまう場合があります。


対象のファイルが他のプロセスで使用されているかどうかを見極める方法はあるのでしょうか?
引用返信 編集キー/
■59795 / inTopicNo.5)  Re[4]: 画像の振り分け方法に関して
□投稿者/ 魔界の仮面弁士 (2199回)-(2011/06/07(Tue) 13:43:14)
No59794 (TN さん) に返信
> 対象のファイルが他のプロセスで使用されているかどうかを
基本的には、実際にアクセスしたときの例外で判定することになるでしょう。

> 見極める方法はあるのでしょうか?
見極めたところで、チェックした次の瞬間に使用中となってしまう可能性もありますよね。
ですからいずれにせよ、エラーチェックは必須かと。
引用返信 編集キー/
■59797 / inTopicNo.6)  Re[5]: 画像の振り分け方法に関して
□投稿者/ クラー (1回)-(2011/06/07(Tue) 13:59:01)
タイマのインターバルが1msだと、移動中のファイルも移動対象と判定されてしまうのではないですか?
(インターバルはもっと長くてもいいと思うのですが、インターバルは1msである必要がありますか?)
やはり、例外処理を行う(エラーとなったらそのファイルの移動は行わない)必要があるでしょうね。
引用返信 編集キー/
■59798 / inTopicNo.7)  Re[1]: 画像の振り分け方法に関して
□投稿者/ 風太郎 (14回)-(2011/06/07(Tue) 14:26:01)
No59784 (TN さん) に返信
> お世話になります。
>
> 現在、Visual Basic 2010にて画像の振り分けソフトを作製しているところです。
>
> 作製したいソフトの内容として、
>
> 「他のソフトより任意のフォルダに保存されてくる画像を、VBで作製したソフトを利用して別フォルダに移動させる」
>
> のが目標です。
>
>
> 現状は、Timerを利用して、1ms間隔で元フォルダを監視させて、ファイルが入ってきたら即移動させるように
> プログラムを作製しているのですが、下記のエラー文がでてしまいます。
> ↓
> 「ファイルが別のプロセスで使用されているため、プロセスはファイルにアクセスできません。」
>
>
> 恐らくですが、別ソフトが画像を保存している最中に、VBで作製したソフトがファイルを移動させようとして
> しまっていると思うのですが、どう対応すれば良いのかが分かりません。
>
>
> 改善策がありましたら、ご教示のほど宜しくお願い致します。
>
>
>

whileを用いて、ファイルにアクセスした際、エラーが出続ける間はループでは如何でしょうか?
不安であるならば、ループを抜けた際に、一度待ち時間を設けてみるというのは?

解決策ではなく、ご提案ですが申し訳ありません。以上。
引用返信 編集キー/
■59799 / inTopicNo.8)  Re[2]: 画像の振り分け方法に関して
□投稿者/ shu (764回)-(2011/06/07(Tue) 14:29:52)
何度かリトライして駄目ならとりあえずキューにでも入れておいて
次のファイルの時にもう一度実行、最初からの時間があまりにも経過していたら
あきらめてキューに戻さないようにするとか。
引用返信 編集キー/
■59801 / inTopicNo.9)  Re[3]: 画像の振り分け方法に関して
□投稿者/ TN (7回)-(2011/06/07(Tue) 15:30:23)

皆様、ありがとうございます。

現状ですが、タイマのインターバルは1msと短いのですが、振り分け動作を実施している間はTimerを
Falseにして、振り分け完了するまでは動作しないようにしてます。

教えて頂いたエラーチェックを入れてみよう!ということで、参考書を見ながら例外処理(Try...Catch...End Try)を
プログラムに入れてみました。
1回目は動作するのですが、それ以降は動作しない現象が起きてしまいます。
使い方が間違っているのでしょうか?

プログラムを見て頂いた方が分かりやすいかと思うので、下に記載させて頂きます。



【プログラム(タイマ部分)】

'************ オンライン時の動作 **************

Private Sub Timer1_Tick_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Dim year As String
Dim month As String
Dim day As String
Dim hour As String
Dim result As String


Try


'画像保存待ち(ファイルの有無確認)

Dim files As String()

files = Nothing

files = System.IO.Directory.GetFiles("C:\test\検査前フォルダ\", "*.bmp")
Dim FolderName As String = "c:\test\検査前フォルダ\"
Dim FileCount As Integer = 0
FileCount = System.IO.Directory.GetFiles(FolderName).Length

If FileCount = 0 Then

Exit Sub

End If

System.Threading.Thread.Sleep(0)


'*********** 画像保存の設定 ************

If SaveMode1.Checked Then

SelectSaveFolder2 = SelectSaveFolder1

'「年」フォルダ作成確認
If FolderName_Year.Checked Then

year = Date.Now.Year
SelectSaveFolder2 = SelectSaveFolder2 & year & "\"

End If

'「月」フォルダ作成確認
If FolderName_Month.Checked Then

month = Date.Now.Month
SelectSaveFolder2 = SelectSaveFolder2 & month & "\"

End If

'「日」フォルダ作成確認
If FolderName_Day.Checked Then

day = Date.Now.Day
SelectSaveFolder2 = SelectSaveFolder2 & day & "\"

End If

'「時」フォルダ作成確認
If FolderName_Hour.Checked Then

hour = Date.Now.Hour
SelectSaveFolder2 = SelectSaveFolder2 & hour & "\"

End If

Dim root As String = System.IO.Path.GetDirectoryName(files(0)) & "\"
Dim name As String = System.IO.Path.GetFileName(files(0))

Dim new_name As String = "test" & name

Dim new_root As String = SelectSaveFolder2



'保存先フォルダが存在するかどうかの確認(なければフォルダ作成)+画像保存の実施

If System.IO.Directory.Exists(SelectSaveFolder2) Then

System.IO.File.Move(root & name, new_root & name)



If FileName1.Checked Then

My.Computer.FileSystem.RenameFile(new_root & name, new_name)

End If

Else

MkDir(SelectSaveFolder2)
System.IO.File.Move(root & name, new_root & name)

If FileName1.Checked Then

My.Computer.FileSystem.RenameFile(new_root & name, new_name)

End If

End If

End If

Timer1.Enabled = True

Catch

Exit Sub

End Try

End Sub

引用返信 編集キー/
■59804 / inTopicNo.10)  Re[4]: 画像の振り分け方法に関して
□投稿者/ shu (765回)-(2011/06/07(Tue) 18:04:09)
2011/06/07(Tue) 18:04:24 編集(投稿者)
No59801 (TN さん) に返信

リトライしない場合、
Timer1.Enabled = False
Try
    ・・・
Catch ex as Exception
  ・・・
Finally
    ・・・
    Timer1.Enabled = True
End Try



リトライする場合、
Timer1.Enabled = False
For Cnt = 1 To 5
    Try
        ・・・
        Exit For
    Catch ex as Exception
      ・・・
    Finally
        ・・・
    End Try
Next
Timer1.Enabled = True


大雑把だとこんな感じ

引用返信 編集キー/
■59819 / inTopicNo.11)  Re[5]: 画像の振り分け方法に関して
□投稿者/ 大御所 (1回)-(2011/06/07(Tue) 20:59:17)
なんかつまんねーな
引用返信 編集キー/
■59820 / inTopicNo.12)  Re[6]: 画像の振り分け方法に関して
□投稿者/ 大胡症 (1回)-(2011/06/07(Tue) 21:00:46)
No59819 (大御所 さん) に返信
> なんかつまんねーな
この発言
私なら許されないけど同じわんくま同盟の大御所なら許されるんでしょ
引用返信 編集キー/
■59916 / inTopicNo.13)  Re[7]: 画像の振り分け方法に関して
□投稿者/ TN (8回)-(2011/06/10(Fri) 19:03:29)
ご教示ありがとうございました。


まだまだ抜けはありそうですが、ひとまず最低限やりたいことができる様になりました!
これから勉強して、少しずつ抜けの部分を修正していくようにします。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -