简单的C#应用​​程序无法正常工作,在Visual Studio中运行时工作正常

我是C#和VS的新手,我有一个奇怪的问题。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ExampleApplication { class Program { static void Main(string[] args) { FileInfo fi = new FileInfo("C:\\TEST.TXT"); fi.Create(); Console.WriteLine("File exists: {0}", fi.Exists); } } } 

这是我的程序,它创build一个文件TEST.TXT。 当我使用Debug – > Start Debugging命令(F5)在VS 2010中运行程序时,程序工作正常,文件被创build。

但是,如果我构build解决scheme,然后使用cmd提示符从.exe运行该程序:

 C:\...\Visual Studio 2010\Projects\ExampleApplication\ExampleApplication\bin\Debug\ExampleApplication.exe 

它运行输出: 文件存在:true 。 但该文件没有创build。 有人有主意吗?

谢谢

也许文件流最终不是由操作系统发布,所以文件系统不反映最近的变化? 试着在创建后明确地关闭一个新的文件流:

 FileInfo fi = new FileInfo("C:\\TEST.TXT"); using (var stream = fi.Create()); 

请让我们知道它是否有效,因为这是一个有点疯狂的想法;)我相信问题可能会更简单

我怀疑用户帐户控制将文件创建重定向到影子副本目录; 在VS下,你以管理员身份运行,所以文件创建不会被重定向。

查看VirtualStore目录中的文件。 那将是

 C:\Users\YourUserNameHere\AppData\Local\VirtualStore 

实际的文件夹将是类似的东西

 C:\Users\YourUserNameHere\AppData\Local\VirtualStore\C 

为了解决这个问题,你可以改变程序,以便将文件写入用户数据的位置; Documents文件夹是一个明显的选择。 您也可以使用管理员权限运行该应用程序。 至少有三种方法可以做到这一点:

  • 右键单击该可执行文件并选择“以管理员身份运行”
  • 在快捷方式属性对话框中选中“以管理员身份运行”复选框后,使用快捷方式运行可执行文件
  • 使用上述任一方法打开“管理员”命令提示符会话; 然后通过在命令提示符处输入其名称来正常运行应用程序。

可能是权限问题。 如果运行vS的用户帐户与运行命令提示符的用户帐户不同,则它们可能具有不同的创建文件权限。 在你的Windows事件查看器中查看是否在那里报告错误。 然后,如Marc所说,使用try-catch。

只是一个小费。 当你使用文件时,一定要试着抓住它。 你永远不会知道在你的情况下会发生什么事情。

你是否以管理员身份运行cmd? 也许你没有创建文件的权利。

还要添加一个try catch,并在控制台中返回错误。 如果以管理员身份运行不起作用,它将帮助您找出问题所在。

  try { your code.. } catch (Exception e) { Console.WriteLine("{0} Exception caught.", e); } 

你需要调用fi.Refresh(); 为了让FileSystemInfo重新检查基础对象,否则它将始终返回false。

尝试关闭文件如下:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ExampleApplication { class Program { static void Main(string[] args) { FileInfo fi = new FileInfo("C:\\TEST.TXT"); fi.Create(); fi.Close(); Console.WriteLine("File exists: {0}", fi.Exists); } } } 

我不知道这个原因,但你为什么不试试这个:

 if(!File.Exists("C:\\TEST.TXT")) { File.Create("C:\\TEST.TXT"); Console.WriteLine("File exists"); } 

你这样做是错误的。 完成之后,您必须处理文件对象。 在.NET中创建一个空文件,我建议你这样做:

 using (File.Create("C:\\TEST.TXT")); 

或者像这样:

 File.Create("C:\\TEST.TXT").Dispose(); 

或者,你可以修改你的fi.Create()来:

 fi.Create().Dispose(); 

当您停止调试时,Visual Studio Debugger很可能会自动清理所有对象。

 use the following code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ExampleApplication { class Program { static void Main(string[] args) { if(!File.Exists("C:\\TEST.TXT")) { GC.Collect(); GC.WaitForPendingFinalizers(); fi.Create(); fi.Close(); Console.WriteLine("File exists: {0}", fi.Exists); } } } } 

这是一个简单的解决方案,

我跑了你的代码,并得到了一个UnauthorizedAccessException这是一个安全异常,你没有正确的安全保存文件在根文件夹(C:\)

如果您将其更改为FileInfo(“TEXT.TXT”); 而不是C:\ TEXT.TXT它将工作

顺便说一句,你不能使用using语句,因为FileInfo没有实现IDisposable接口。