简单的 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 应用程序上无法正常工作?

C# 代表。铸造由于某种原因无法正常工作

在 C# 中拆分文本文件无法正常工作

C# 线程问题,我无法正常工作,在 Events_DataReceived 中调用

语法高亮在 vscode 中的 c# 10.0 中无法正常工作