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

时间:2012-03-11 22:02:24

标签: c# .net windows visual-studio-2010 file-io

我是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);
        }
    }
}

这是我的程序,它创建了一个文件TEST.TXT。当我使用Debug - >在VS 2010中运行程序时启动调试命令(F5),程序运行正常,文件已创建。

但是,如果我构建解决方案,则使用cmd提示符从.exe运行程序:

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

它运行输出:文件存在:true 。但是文件没有创建。有人有什么想法吗?

由于

10 个答案:

答案 0 :(得分:3)

也许文件流最终没有被OS发布,所以文件系统不反映最近的变化?只需尝试在创建后显式关闭新文件流:

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

请告诉我们它是否有效,因为它有点疯狂;)我相信问题可能很简单

答案 1 :(得分:3)

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

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

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

实际的文件夹就像是

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

只是小费。处理文件时,请始终在try catch中执行此操作。你永远不知道在你的情况下会发生什么。

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

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

        try
        {            
            your code..
        }

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

尝试关闭文件,如下所示:

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);
        }
    }
}

答案 7 :(得分:1)

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

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

或者像这样:

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

或者您可以将fi.Create()修改为:

fi.Create().Dispose();

当您停止调试时,Visual Studio Debugger可能会通过正确处理所有对象来自动清理您的混乱。

答案 8 :(得分:1)

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);
        }
      }
    }
}

答案 9 :(得分:1)

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

我运行了代码并获得了UnauthorizedAccessException,这是一个安全异常 您没有正确的安全性来保存根文件夹(C:\)

中的文件

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

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