如何利用vb.net解决系统安全异常

如何利用vb.net解决系统安全异常,vb.net,filesystemobject,Vb.net,Filesystemobject,在其中一个案例中,我得到了 当我尝试在vb.net中创建文件并使用文件系统对象写入数据时,HRESULT:0x800A0046(CTL_E_PERMISSIONDENIED)出现异常 DIM fso,file const ForWriting = 2 fso = CreateObject("Scripting.FileSystemObject") file= fso.opentextfile("C:\test\log.csv",ForWriting,True) file.write("This,

在其中一个案例中,我得到了
当我尝试在vb.net中创建文件并使用文件系统对象写入数据时,HRESULT:0x800A0046(CTL_E_PERMISSIONDENIED)出现异常

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()

如何解决这个问题,敬请指教。

除非绝对必要,否则使用遗留的COM
文件系统对象是个坏主意。使用.NET framework中的托管库将为您提供更好的错误信息。例如,您只需执行以下操作即可完成完全相同的任务:

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

我在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 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();
所以我尝试了这个,它对我有效:

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,它就会锁定在文件系统上。

如果这是VB.Net,请使用System.IO命名空间,而不是旧的FileSystemObject@Jodrell我已经声明了名称空间,这是第一次它突然出现,即使没有更改任何东西,我也可以创建文件,在什么情况下它会抛出错误,我如何解决它?@jordell这能帮助我解决问题吗:抛出错误是因为您没有编辑<代码>的权限“C:\test\log.csv“
文件,或者因为另一个用户正在使用该文件。您需要知道您编写的代码是以什么用户的身份运行的,并确保您拥有对此文件的权限,并确保其他进程或用户未使用这些文件。除此之外,使用legact FileSystemObject不是一个好主意。但有一件事我想理解,为什么拒绝许可会说,我们需要设置什么样的许可?使用您的代码片段会有什么好处,它会解决问题吗?请帮我解决这个问题首先,它使用托管程序集而不是COM。这意味着它将抛出标准的.NET异常,而不是COM错误。NET异常有更多的信息,包括堆栈跟踪。这可以帮助您确定它失败的确切原因。避免使用COM还意味着您可以编译到任何CPU,简化了分发,代码更易于阅读和维护,等等。试试这个,然后发布您得到的异常,这样我们就可以帮助您了。通常是因为该文件正被另一个应用程序(甚至是您自己的应用程序)使用,或者是只读的。