- PR -

ファイルの排他制御

投稿者投稿内容
AKARI0418
会議室デビュー日: 2009/01/30
投稿数: 8
投稿日時: 2009-02-05 11:28
Jitta様、あしゅ様解答ありがとうございます。

DBにもっと信頼を置いて設計を組み立てなおすことにいたします。

>バックアップを複数の方法で取っておくのは有効だと思います。
人為的なミス(間違って削除してしまうなど)に対しても強くなりますし。

アプリ上でとるログは、人為的なミスのリカバリに使用する方向で考えることにいたします。
リストア・リカバリ用のバックアップはOralceのRecovery Managerで管理することにいたします。

>Oracle のログ機能に任せ、そのログから復元するために、一連のコマンドを発行するアプリケーションを作ればいいのでは?
再起動で復旧できない障害について検討してみたいと思います。

バックアップについて、いろいろご指導いただきまことにありがとうございました。


スレッドのタイトルの件ですが、
ファイルの排他制御をするなら、名前つきのMUTEXと指摘していただきましたので、
以下のようなコンソールアプリケーションを作成してみました。
外部からループして起動すると、
エラーでいくつかのプロセスがアボートしてしいまいます。


Sub Main(ByVal CmdArgs() As String)
Dim PathName As String = "D:\test.txt"
Dim WritDat As String = Nothing
For i As Integer = 0 To CmdArgs.Count - 1
WritDat &= CmdArgs(i)
Next
WriteCsv(PathName, WritDat)
End Sub
Private Sub WriteCsv(ByRef PathName As String, ByRef WriteDat As String)
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Dim mtx As Mutex ' = New Mutex
Dim mflag As Boolean = False
mtx = New Mutex(True, "myname", mflag)
Do While mflag = False
mtx.ReleaseMutex()
mtx.Close()
mtx = Nothing
mtx = New Mutex(True, "myname", mflag)
Loop
mtx.WaitOne()
Try
Using writer As System.IO.StreamWriter = New System.IO.StreamWriter(PathName, True, enc)
writer.WriteLine(WriteDat)
writer.Close()
End Using

Catch ex As Exception

End Try
mtx.ReleaseMutex()
mtx.Close()
mtx = Nothing
End Sub
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-02-05 23:11
引用:

AKARI0418さんの書き込み (2009-02-05 11:28) より:
スレッドのタイトルの件ですが、
ファイルの排他制御をするなら、名前つきのMUTEXと指摘していただきましたので、
以下のようなコンソールアプリケーションを作成してみました。
外部からループして起動すると、
エラーでいくつかのプロセスがアボートしてしいまいます。


 どこで、どんな例外を出して、止まってしまうのでしょう?
 例えば、Mutex コンストラクタ<microsoft.com> を見ると、このコンストラクタでは4種類の例外が送出される可能性があります。ArgumentException はないとして、どれかによって原因も対応方法も異なります。

引用:

コード:
    Dim mtx As Mutex ' = New Mutex
    Dim mflag As Boolean = False
    mtx = New Mutex(True, "myname", mflag)
    Do While mflag = False
        mtx.ReleaseMutex()
        mtx.Close()
        mtx = Nothing
        mtx = New Mutex(True, "myname", mflag)
    Loop
    mtx.WaitOne()




いや、こんなことしなくても。。。
コード:
    Dim mflag As Boolean
    Dim mtx As Mutex = New Mutex(True, "myname", mflag)
    If mflag = False Then
        mtx.WaitOne()
    End If


AKARI0418
会議室デビュー日: 2009/01/30
投稿数: 8
投稿日時: 2009-02-06 09:43
Jitta様回答ありがとうございます。

動作の確認が取れました、ありがとうございます。

Mutexはこれで使うだけならできそうです。

セマフォを利用した、排他はどの用にすればよいでしょうか?
VB6ではCreateSemaphore等のAPIを使用するようなのですが、
.NET Frameworkではセマフォはサポートされているのでしょうか?

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