2012-07-17 81 views
0

的情況下的一個解決系統安全例外,我已經拿到了 Exception from HRESULT: 0x800A0046 (CTL_E_PERMISSIONDENIED)當我試圖使用文件系統對象在vb.net如何使用vb.net

DIM fso,file 
const ForWriting = 2 
fso = CreateObject("Scripting.FileSystemObject") 
file= fso.opentextfile("C:\test\log.csv",ForWriting,True) 
file.write("This,is,a,sampledata") 
file.close() 

創建文件和寫入數據我怎麼理解這個問題,好心的建議。

+0

vbscript or vb.net? – Jodrell 2012-07-17 14:30:37

+0

如果這是VB.Net,請使用System.IO命名空間而不是舊的FileSystemObject。 http://msdn.microsoft.com/en-us/library/system.io.file.createtext.aspx – Jodrell 2012-07-17 14:39:11

+0

@Jodrell我已經宣佈命名空間,這是第一次它突然來了,甚至在沒有改變任何事情我可以創建文件也在哪些情況下,它會拋出錯誤,我該如何解決它? – user1494292 2012-07-17 14:47:29

回答

0

使用傳統的COM FileSystemObject,除非絕對必要,否則不是一個好主意。使用.NET框架中的託管庫將爲您提供更好的錯誤信息。例如,你可以簡單地做到完全相同的事情:

Try 
    File.WriteAllText("C:\test\log.csv", "C:\test\log.csv") 
Catch ex As Exception 
    ' Handle the exception. See ex.ToString() for full info. 
End Try 
+0

但有一件事我想明白,爲什麼權限被拒絕,它說,我們需要設置什麼樣的權限?通過使用您的代碼段會得到什麼好處,它能夠解決問題嗎?請幫我解決這個問題 – user1494292 2012-07-17 16:34:06

+0

首先,它使用託管程序集而不是COM。這意味着它會拋出標準的.NET異常,而不是COM錯誤。 .NET異常有更多的信息,包括堆棧跟蹤。這可以幫助你確定爲什麼它失敗。避免COM也意味着你可以編譯到任何CPU,你的發行版被簡化了,你的代碼更易於閱讀和維護等等。試試這個併發布你得到的異常,以便我們可以從那裏幫助你。通常這是因爲該文件正在被另一個應用程序(甚至是您自己的)使用,或者它是隻讀的。 – 2012-07-17 16:40:39

0

我得到了與JScript相同的問題,但只有當我創建文件之前。

var fso = new ActiveXObject("Scripting.FileSystemObject"); 
fso.CreateTextFile(filename); 

如果文件已存在,我可以讀取或寫入文件。

var fso = new ActiveXObject("Scripting.FileSystemObject"); 

// Create the file, and obtain a file object for the file. 
var filename = "testfile.txt"; 

//here no create! --> fso.CreateTextFile(filename); 
var fileObj = fso.GetFile(filename); 

// Open a text stream for output. 
var ts = fileObj.OpenAsTextStream(ForWriting, TristateUseDefault); 

// Write to the text stream. 
ts.WriteLine("Hello World!"); 
ts.WriteLine("The quick brown fox"); 
ts.Close(); 

它的作品,但它是一種解決方法,如果你知道你需要的文件。 否則,您將獲得System.Security.SecurityException:HRESULT:0x800A0046(CTL_E_PERMISSIONDENIED)。

編輯:: MSDN說: 在上面顯示的代碼中,CreateObject函數返回FileSystemObject(fs)。然後,CreateTextFile方法將該文件創建爲TextStream對象(a),WriteLine方法將一行文本寫入創建的文本文件。 Close方法刷新緩衝區並關閉文件。

所以我想這和它的作品對我來說:打造你必須先關閉該文件

var ForReading = 1, ForWriting = 2, ForAppending = 8; 
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0; 

var fso = new ActiveXObject("Scripting.FileSystemObject"); 

// Create the file, and obtain a file object for the file. 
var filename = "testfile.txt"; 
var tss = fso.CreateTextFile(filename); 
tss.close(); 
var fileObj = fso.GetFile(filename); 

// Open a text stream for output. 
var ts = fileObj.OpenAsTextStream(ForWriting, TristateUseDefault); 

// Write to the text stream. 
ts.WriteLine("Hello World!"); 
ts.WriteLine("The quick brown fox"); 
ts.Close(); 

後,因爲createFileMethod創建該文件作爲TextStream對象。只要它創建爲TextStream,它就會鎖定在文件系統上。