我是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 。但是文件没有创建。有人有什么想法吗?
由于
答案 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接口。