简单的 C# 应用程序无法正常工作,在 Visual Studio 中运行时工作正常
Posted
技术标签:
【中文标题】简单的 C# 应用程序无法正常工作,在 Visual Studio 中运行时工作正常【英文标题】:Simple C# application not working correctly, works fine when run from within Visual Studio 【发布时间】:2012-03-28 09:28:45 【问题描述】:我是 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 -> Start Debugging 命令 (F5) 在 VS 2010 中运行程序时,程序运行正常并创建了文件。
但是,如果我构建解决方案,然后使用 cmd 提示符从 .exe 运行程序:
C:\...\Visual Studio 2010\Projects\ExampleApplication\ExampleApplication\bin\Debug\ExampleApplication.exe
它运行输出:文件存在:true。但是没有创建文件。有人有什么想法吗?
谢谢
【问题讨论】:
可能是版权问题。尝试使用管理员权限运行您的 exe,看看是否可行。 你确定它不存在吗?fi.Create()
行显式创建文件。
该文件肯定不存在。当我从 VS 中运行它时,它创建得很好。我已经用管理员权限运行了.exe,仍然没有修复。我已经修改了程序以编写它现在打印的更多信息:
文件存在:True 文件名:C:\TEST.TXT 文件长度:0,但实际上并不存在。如果我尝试从记事本打开它,或者只是在资源管理器中查看它不存在。
在我的 PC (Win7x64 Net4) 上试用过,并且按预期工作!可能是权限问题。您是否尝试在根目录(记事本)中手动创建文件?
【参考方案1】:
也许文件流最终没有被操作系统发布,所以文件系统没有反映最近的变化?只需尝试在创建后显式关闭新文件流:
FileInfo fi = new FileInfo("C:\\TEST.TXT");
using (var stream = fi.Create());
请让我们知道它是否有效,因为这有点疯狂;)我相信问题可能更简单
【讨论】:
@RickyJones:您是否分享了您正在使用的确切源代码?也许你已经删除了一些你认为不重要的小东西?请分享确切的代码,也许您有类似Console.ReadLine()
或您在此处发布时跳过的任何内容?【参考方案2】:
我怀疑用户帐户控制正在将文件创建重定向到卷影副本目录;在 VS 下您以管理员身份运行,因此不会重定向文件创建。
查看 VirtualStore 目录中的文件。那将在
C:\Users\YourUserNameHere\AppData\Local\VirtualStore
实际的文件夹类似于
C:\Users\YourUserNameHere\AppData\Local\VirtualStore\C
要解决此问题,您可以更改程序,使其将文件写入用于存储用户数据的位置;一个明显的选择是Documents
文件夹。您还可以使用管理员权限运行该应用程序。至少有三种方法可以做到这一点:
【讨论】:
【参考方案3】:可能是权限问题。如果运行 vS 的用户帐户与运行命令提示符的用户帐户不同,则它们可能具有不同的创建文件的权限。查看您的 Windows 事件查看器以查看那里是否报告了错误。然后,按照 Marc 的建议使用 try-catch。
【讨论】:
【参考方案4】:只是一个提示。当你处理文件时,总是在 try catch 中进行。你永远不知道你的情况会发生什么。
您是否以管理员身份运行 cmd?也许您没有创建文件的权限。
另外添加一个 try catch 并在控制台中返回错误。如果以管理员身份运行不起作用,它将帮助您找出问题。
try
your code..
catch (Exception e)
Console.WriteLine("0 Exception caught.", e);
【讨论】:
谢谢,但没有抛出异常。 您是否以管理员身份运行 cmd?【参考方案5】:你需要调用 fi.Refresh();为了让 FileSystemInfo 重新检查基础对象,否则,它将始终返回 false。
【讨论】:
【参考方案6】:尝试如下关闭文件:
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);
【讨论】:
FileInfo
没有提供Close
方法,也许你的意思是FileStream.Close()
?【参考方案7】:
我不知道这是什么原因,但你为什么不试试这个:
if(!File.Exists("C:\\TEST.TXT"))
File.Create("C:\\TEST.TXT");
Console.WriteLine("File exists");
【讨论】:
Fun ;) 当文件实际存在时,它会打印File does not exists
;)
你的意思是它创建了一个文件但写的是'文件不存在'?
只需阅读您的else
块,它会在File.Exists("C:\\TEST.TXT") == true
时运行【参考方案8】:
你这样做是错误的。完成后,您必须处理文件对象。要在 .NET 中创建一个空文件,我建议您这样做:
using (File.Create("C:\\TEST.TXT"));
或者像这样:
File.Create("C:\\TEST.TXT").Dispose();
或者,您可以将fi.Create()
修改为:
fi.Create().Dispose();
当您停止调试时,Visual Studio 调试器很可能会通过正确处理所有对象来自动为您清理混乱。
【讨论】:
另外,在尝试此代码之前,我建议您重新启动 PC,以确保 Windows 不会再次尝试使用相同的内存空间。【参考方案9】: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);
【讨论】:
【参考方案10】:这是一个简单的解决方案,
我运行你的代码并得到一个 UnauthorizedAccessException 这是一个安全异常 您没有正确的安全性将文件保存在根文件夹 (C:\)
如果你把它改成 FileInfo("TEXT.TXT");而不是 C:\TEXT.TXT 它会工作
顺便说一句,你不能使用 using 语句,因为 FileInfo 没有实现 IDisposable 接口。
【讨论】:
以上是关于简单的 C# 应用程序无法正常工作,在 Visual Studio 中运行时工作正常的主要内容,如果未能解决你的问题,请参考以下文章
Windows 下 C++ 和 C# 中的套接字无法正常工作
NAudio lame 将文本转换为 mp3 在服务器 c# Web 应用程序上无法正常工作?