2013-03-18 47 views
1

在此問題中其他用戶提出了一些重要論點:How to write to a text file inside of the application後,我決定不使用資源文件,而是在文件夾中創建一個文件&然後從/那裏。程序無法寫入新建的文本文件

雖然由於某種原因,我似乎無法寫入有問題的文件,但它一直拋出異常,告訴我該文件已被另一進程使用。

下面是我用於寫入此文件的代碼。

If System.IO.File.Exists(credentials) Then 
         Dim objWriter As New System.IO.StreamWriter(credentials, False) 
         objWriter.WriteLine(remember) 
         objWriter.Close() 
        Else 
         System.IO.Directory.CreateDirectory(Mid(My.Application.Info.DirectoryPath, 1, 1) & ":\ProgramData\DayZAdminPanel") 
         System.IO.File.Create(credentials) 
         Dim objWriter As New System.IO.StreamWriter(credentials, False) 
         objWriter.WriteLine(remember) 
         objWriter.Close() 
        End If 

關於如何寫入有問題的文本文件的任何想法?

回答

1

您正試圖在公共應用程序數據目錄中創建一個目錄。應該使用Environment類方法和枚舉找到該目錄,因爲在操作系統之間不同。但是,您使用值爲credentials作爲文件名。我想你想要將數據文件存儲在公共應用程序目錄中,而不是在沒有寫入數據文件權限的地方(如C:\ program files(x86))。

然後,以避免問題的文件流無法正常關閉,嘗試使用,保證您的文件資源的正確關閉和處置Using statement(無需千鈞一髮內使用)。

此外,請注意,StreamWriter完全有能力創建該文件,如果它不存在或如果您希望覆蓋以前的內容(爲Append標誌傳遞false)。
所以你的代碼可以簡化爲這些行。

' Get the common application data directory (could be different from Win7 and XP) 
Dim workDir = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) 
' Combine with your own working data directory 
workDir = Path.Combine(workdir, "DayZAdminPanel") 
' Create if not exists 
If Not Directory.Exists(workDir) Then 
    Directory.CreateDirectory(workDir) 
End If 

' Create/Overwrite your data file in a subfolder of the common application data folder 
Dim saveFile = Path.Combine(workDir, Path.GetFileName(credentials)) 
Using objWriter = New System.IO.StreamWriter(saveFile, False) 
    objWriter.WriteLine(remember) 
End Using 
+0

謝謝,這是有效的,但我更喜歡將文件保存在我的問題中使用的目錄中。 – Yorrick 2013-03-18 22:42:00

+0

Enum'SpecialFolder.CommonApplicationData'在Win7中解析爲C:\ PROGRAMDATA,在C:\ DOCUMENTS&SETTINGS \ ALLUSER ...中爲XP。所以,這是獨立於底層操作系統的方式。 – Steve 2013-03-18 22:44:40

+0

哦,我看到了,我認爲'SpecialFolder.CommmonApplicationData'是%appdata%區域中位置的參考。我的壞 – Yorrick 2013-03-18 23:08:52

0

File.Create返回打開FileStream,你應該傳遞到StreamWriter構造上的後續,而不是再次通過文件名,或者你可以省略File.Create呼叫乾脆。

您可能想要查看Using區塊的StreamWriter,以便它可預測地關閉。

+0

所以我應該能夠使用粘貼在這個pastebin中的代碼? [鏈接](http://pastebin.com/X62QxP7U),省略檢查文件是否存在,目錄創建和文件創建? – Yorrick 2013-03-18 22:38:52

2

以前的應用程序迭代很有可能無法正確關閉對StreamWriter中文件的訪問。由於你的構造函數被設置爲覆蓋(而不是追加)到文件中,所以這可能是源代碼。

嘗試用「使用」設置您的應用程序語句正常打開/關閉文件:

If System.IO.File.Exists(credentials) Then 

    Using objWriter As StreamWriter = New StreamWriter(credentials, False) 
     objWriter.WriteLine(remember) 
     objWriter.Close() 
    End Using 

Else    

    System.IO.Directory.CreateDirectory(Mid(My.Application.Info.DirectoryPath, 1, 1) & ":\ProgramData\DayZAdminPanel") 
    System.IO.File.Create(credentials) 

    Using objWriter As StreamWriter = New StreamWriter(credentials, False) 
     objWriter.WriteLine(remember) 
     objWriter.Close() 
    End Using 

End If 

它看起來確實冗餘有一個使用塊和密切的聲明,但是這確保訪問即使發生異常也是如此。

+0

謝謝:)以這種方式完美工作。 – Yorrick 2013-03-18 22:42:22