- PR -

ファイルが消せない

1
投稿者投稿内容
テラ
会議室デビュー日: 2008/02/18
投稿数: 9
投稿日時: 2008-03-12 13:29
お世話になります。
2回目の質問になります。
開発環境
ActiveReports for .NET 2.0J SP1
Microsoft Visual Basic 2005
Windows XP

状況
印刷用のレポートにイメージを貼り付けています。
イメージはjpgファイルです。
jpgファイルが大量にできるので、使用後に削除しようとしています。
しかし、下記の内容のエラーになり削除できません。
別のプロセスで使用されているため、プロセスはファイル***.jpgにアクセスできません。

対策 : レポートはメモリーから開放する
objSijisyorpt = Nothing 'レポートオブジェクト

削除部分
If System.IO.Directory.Exists(strdelflder) = True Then
Dim afs As String() = System.IO.Directory.GetFiles(strdelflder, "*.jpg")
'ArrayListに追加する
files.AddRange(afs)
For j = 0 To files.Count - 1
' ファイルを削除する
System.IO.File.Delete(files.Item(j)) ←ここでエラーになります
Next
End If

タイミングによっては、数件削除できて次がエラーの時もあります。

どう対処してよいか行き詰まり、問合せしました。



あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2008-03-12 13:37
問題があるのは削除処理ではなく
印刷用のレポートにイメージを貼り付けている場所ではないかと
予測します。

どのような処理をしているのかわかりませんが
(JPGを読み込んで貼り付け?)
そこでJPGをつかみっぱなしになっているのではないでしょうか。

レポートを開放しても
JPGは開放されないと思います。
テラ
会議室デビュー日: 2008/02/18
投稿数: 9
投稿日時: 2008-03-12 14:16
ご返事ありがとうございます。

イメージを貼り付けている処理は
Picture1.Image = System.Drawing.Image.FromFile(strKadaiPath(0))

この後に何か処理が必要なのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-03-12 15:00
引用:

テラさんの書き込み (2008-03-12 14:16) より:

イメージを貼り付けている処理は
Picture1.Image = System.Drawing.Image.FromFile(strKadaiPath(0))

この後に何か処理が必要なのでしょうか?


FileStream のインスタンスを生成して FromStream メソッドを使いましょう。 あとは FileStream を Close すれば良いです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
テラ
会議室デビュー日: 2008/02/18
投稿数: 9
投稿日時: 2008-03-12 15:38
ご回答ありがとうございます。

回答のイメージは有るのですが、具体的なコーディングがエラーになります。
調べたのですが、まだ、経験が浅いのかピントきません。

Dim file1 As new FileStream = System.Drawing.Image.FromStream(strKadaiPath(0))
               ----- ここがエラーです ----------------------

Picture1.Image = System.Drawing.Image.FromFile(file1)

具体的な内容はどうなりますか?

あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2008-03-12 16:09
エラーは文法が間違っているせいでしょう
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2008-03-12 18:23
もう解決してそうだけど・・・・
脳内コーディングです。開発環境無しで書いたから、間違ってたらごめんなさい。

コード:
        Dim _stream As System.IO.FileStream = Nothing
        Dim _image As System.Drawing.Image = Nothing

        Try
            _stream = New System.IO.FileStream("path", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
            _image = System.Drawing.Image.FromStream(_stream)
            '----画像処理してね----
        Finally
            If _image IsNot Nothing Then
                _image.Dispose()
            End If
            If _stream IsNot Nothing Then
                _stream.Close()
                _stream.Dispose()
            End If
        End Try

        Dim _fileList As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = Nothing

        _fileList = My.Computer.FileSystem.GetFiles("DirectoryPath", FileIO.SearchOption.SearchTopLevelOnly, "*.jpg")
        For Each _filePath As String In _fileList
            Try
                My.Computer.FileSystem.DeleteFile(_filePath, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin, FileIO.UICancelOption.ThrowException)
            Catch ex As Exception
                MessageBox.Show(ex.ToString(), ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        Next

テラ
会議室デビュー日: 2008/02/18
投稿数: 9
投稿日時: 2008-03-21 09:31
セラフさん、ありがとうございます。
文法が間違っていると書込みがありましたので、ここを頼ってばかりではいけないと思い。自分で2日ぐらい調べました。
結局、帳票に貼るイメージとその表示ファイルとの関連が明確にならずに諦めました。
イメージでファイルを取込んで、ファイルを開放したかったです。
諦めたので、別の対応を行いました。
処理としては、月曜〜金曜までの進捗状況を時数とイメージで画面表示します。
イメージファイルの名称を個人+日時+処理.jpgと絶対に重複しない名称にして、表示させ。
jpgを消すのは次回このシステムを立ち上げた時にして対応しました。
jpgの画面表示をさせていないので、誰もjpgは掴んでいないので消えました。
古典的ですが、これしか思いつきませんでした。

セラフさんのやり方で一度試してみます。
まだまだ、知識不足です・・色々なことにチャレンジして力を付けて行きたいです。
ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)