【问题标题】:Simple C# application not working correctly, works fine when run from within Visual Studio简单的 C# 应用程序无法正常工作,在 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) 上试用过,并且按预期工作!可能是权限问题。您是否尝试在根目录(记事本)中手动创建文件?

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


【解决方案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 接口。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-11
            • 1970-01-01
            • 1970-01-01
            • 2017-10-15
            • 2022-07-04
            相关资源
            最近更新 更多