2011-07-15 6 views
1

"C:\ Test \ test.txt"というパスにテキストファイルを保存しようとしていますが、ファイルが既に開かれている場合は、そのファイルが開かれているかどうかを確認してから、ファイル。私はメモ帳のプロセスを閉じることができるよ。この方法をやっている場合はテキストファイルが開いているかどうかをチェックしてテキストファイルを閉じますか?

'Check if file exists 
    If System.IO.File.Exists(myfile) = True Then 
     'Delete it! 

     Dim fi As New FileInfo(myfile) 
     fi.Delete() 
    End If 



    Using sfdlg As New Windows.Forms.SaveFileDialog 
     sfdlg.DefaultExt = "amk" 
     sfdlg.Filter = "AquaMark Project|*.amk" 
     If sfdlg.ShowDialog = Windows.Forms.DialogResult.OK Then 


      Dim SaveData As New gCanvasData 


      IO.Directory.CreateDirectory("C:\Test") 
      Dim w As New IO.StreamWriter("C:\Test\test.txt") 
      Dim i As Integer 


      For i = 0 To CheckedListBox1.Items.Count - 1 
       w.WriteLine(CheckedListBox1.Items.Item(i)) 
      Next 
      w.Close() 
      With SaveData 
       frmDisplay.GCanvas1.UnselectCurrentAnotate() 
       .gAnnotates = frmDisplay.GCanvas1.gAnnotates 
       .Image = frmDisplay.GCanvas1.Image 
      End With 

      Using objStreamWriter As New StreamWriter(sfdlg.FileName) 
       Dim x As New XmlSerializer(GetType(gCanvasData)) 
       x.Serialize(objStreamWriter, SaveData) 
       objStreamWriter.Close() 
      End Using 
     End If 
    End Using 

:文字列=「\テスト\ test.txtのC」として 薄暗いmyfileを:ここで

は、ファイルを保存するためのコードです私は、StreamReaderをが開いているかどうかをチェックするためにできるようになりますプロパティがあるとは思わない

Dim Process() As Process = System.Diagnostics.Process.GetProcessesByName("notepad") 
Process() = CType(Interaction.GetObject("C:\Test\test.txt"), Diagnostics.Process()) 
For Each p As Process In Process 
    p.Kill() 
Next 
+2

なぜ今とても失礼ですか?彼の質問に何が間違っていますか? – sealz

+0

回答を別の解決策で更新しました – sealz

答えて

3

:しかし、私は特定の開かれたテキストファイルを閉じる必要があります。

ベストプラクティスは.closeと読者にあると思われます。 (すべての方法で使用されていました)

まだ例外が発生している場合は、try blockを試して例外を処理できます。

ここで追加情報とサンプルコードを見つけることができます。がんばろう。

MSDN! StreamReader

EDIT:あなたはこれを使用してチェックすることができるかもしれません。どうIO.File

Private Function CheckFile(ByVal filename As String) As Boolean 

    Try 
     System.IO.File.Open(filename, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None) 
     FileClose(1) 
     Return False 
    Catch ex As Exception 
     Return True 
    End Try 

End Function 
+1

提案に感謝します。私は試してみます。 –

+0

編集した回答をリンクに含める幸運 – sealz

+0

それは動作しませんでしたが、私はthis.Anyways感謝のための答えを見つけたか私を助けて。 –

2

If File.Exists("File1.txt") = False Then 
      File.CreateText("File1.txt").Close() 
     Else 
      Exit Sub 
     End If 

     If File.Exists("File2.txt") = False Then 
      File.CreateText("File2.txt").Close() 
     Else 
      Exit Sub 
     End If 
End If 
1
Private Sub IsFileOpen(ByVal file As FileInfo) 
    Dim stream As FileStream = Nothing 
    Try 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None) 
    Catch ex As IOException 

     If IsFileLocked(ex) Then 
      'do something here, either wait a few seconds, close the file if you have 
      'a handle, make a copy of it, read it as shared (FileAccess fileAccess = FileAccess.Read, FileShare fileShare = FileShare.ReadWrite). 
      'I dont recommend terminating the process - which could cause corruption and lose data 
     End If 
    Catch ex As Exception 

    End Try 
End Sub 

Private Shared Function IsFileLocked(exception As Exception) As Boolean 
    Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1) 
    Return errorCode = 32 OrElse errorCode = 33 
End Function 
+0

例外タイプをキャッチするために 'ex as Exception'の前に' catch ex as IOException'を使用してください。 – fcm

1

次の関数を決定するために使用することができますが、ファイルが既に開いている(true)か、しない(false)です。アクションは、Functionの結果に基づいています。

Public Function IsFileOpen(ByVal xFileName As String, ByVal xFileChannel As Integer) As Boolean 
    ' ************************************************************ 
    ' * Function: IsFileOpen 
    ' * Purpose: To determine if a file is already open. 
    ' *   Can be used to determine if a file should be closed. 
    ' * Syntax: 
    ' *  Dim bResult as Boolean 
    ' * 
    ' *  bResult = IsFileOpen("C:\Test.txt", 1) 
    ' * 
    ' *  OR 
    ' * 
    ' *  If IsFileOpen("C:\Test.txt", 1) = True Then 
    ' *   Microsoft.VisualBasic.FileClose(1) 
    ' *  End If 
    ' * 
    ' ************************************************************ 
    Try 
     Microsoft.VisualBasic.FileOpen(xFileChannel, xFileName, OpenMode.Input, OpenAccess.Read, OpenShare.Default) 
    Catch 
     ' File Already Open Error Number = 55 
     If Trim(Err.Number.ToString) = "55" Then 
      Return True 
     Else 
      Return False 
     End If 
    End Try 
End Function 
0

私のプログラムは電子メールに添付された.csvファイルでこの問題を抱えていました。 MailMessageオブジェクトのAttachmentsコレクションをクリアし、メールが送信された後にMailMessageオブジェクトとAttachmentオブジェクトを破棄するコードを追加しました。それは問題を解決したようだ。

関連する問題