【问题标题】:Reading files in C# Mono Debian not working在 C# Mono Debian 中读取文件不起作用
【发布时间】:2015-07-04 13:29:49
【问题描述】:

我在 Debian 上使用 MonoDevelop,以下代码有问题:

using (StreamReader sr = new StreamReader(File.Open(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))

它在 Windows 中运行良好,并且在通过 MonoDevelop 运行时运行良好。但是,如果我像 mono output.exe 或 sudo mono output.exe 第一次使用此代码的方法运行它,它工作正常。但是第二次失败了。它不写任何东西,不会抛出异常。我也尝试用try catch finally 替换using,但没有抛出异常。我认为它只是无法读取文件。

使用此代码的方法由 FileSystemWatcher 更改事件调用。我正在通过 VIM 更改文件。

任何想法如何找出问题所在?为什么在 MonoDevelop 中它工作得很好(所以我无法跟踪它),如果从终端运行它只是第一次工作(总是调用该方法,但不读取文件,也没有抛出异常,它甚至不会进入 using{ } )。

谢谢!

【问题讨论】:

  • 我要调查两件事:1. 也许 FileSystemWatcher 事件在您认为是的时候没有被调度,以及 2. 在某些情况下尝试打开文件时 File.Open 可能会阻塞。跨度>
  • @Rob 我一直在通过 Console.WriteLine 跟踪 FileSystemWatcher 事件,它被触发但 using (StreamReader ....) 行被跳过,没有做任何其他事情。就像会有return。我一直在使用 StreamReader,它正在解决这个问题,所以我尝试使用 File.Open 流来添加模式和访问条件,但它没有改变。我应该尝试其他读取文件的方法吗?
  • 您使用的是哪个单声道版本?
  • @RobertN 3.2.8 (Debian 3.2.8+dfsg-4+rpi1)

标签: c# linux file-io mono


【解决方案1】:

在 3.2.8 下,我遇到了一个与文件观察程序事件未触发有关的不同问题(已修复的已知问题)。使用 3.12.1 或 4.0.x+ 以下代码对我来说很好,但这不在 R-PI 上。试一试您的 RPI-Debian/Mono 3.2.8 安装,看看它是否是与 R-PI 相关的错误/问题。

示例输出(Ctrl-C 退出):

>>mcs Program.cs
>>mono Program.exe 
Created watcher for /var/folders/hc/xf7j8x7j72dg7g098mwkhbs40000gp/T/tmp438e6660.tmp
Changed: '/var/folders/hc/xf7j8x7j72dg7g098mwkhbs40000gp/T/tmp438e6660.tmp', type: Changed
0Changed: '/var/folders/hc/xf7j8x7j72dg7g098mwkhbs40000gp/T/tmp438e6660.tmp', type: Changed
01Changed: '/var/folders/hc/xf7j8x7j72dg7g098mwkhbs40000gp/T/tmp438e6660.tmp', type: Changed
012Changed: '/var/folders/hc/xf7j8x7j72dg7g098mwkhbs40000gp/T/tmp438e6660.tmp', type: Changed
0123Changed: '/var/folders/hc/xf7j8x7j72dg7g098mwkhbs40000gp/T/tmp438e6660.tmp', type: Changed

示例程序.cs

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace FileWatcher
{
    class Program
    {
        static int counter = 0;

        public static void Main (string[] args)
        {
            var tempDir = Path.GetTempPath ();
            var tempFile = Path.GetTempFileName ();
            var fsw = new FileSystemWatcher (tempDir, Path.GetFileName (tempFile));
            fsw.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size;
            fsw.Changed += WatcherOnChanged;
            fsw.EnableRaisingEvents = true;
            Console.WriteLine ("Created watcher for {0}", tempFile);
            var cts = new CancellationTokenSource ();
            Console.CancelKeyPress += (s, e) => {
                e.Cancel = true;
                cts.Cancel ();
            };    
            MainAsync (tempFile, cts.Token).Wait ();
            fsw.Dispose ();
            File.Delete (tempFile);
        }

        static async Task MainAsync (string fileName, CancellationToken token)
        {
            while (!token.IsCancellationRequested) {
                WriteFile (fileName);
                Thread.Sleep (2000);
            }
        }

        private static void WatcherOnChanged (object sender, FileSystemEventArgs eventArgs)
        {
            Console.WriteLine ("Changed: '{0}', type: {1}", eventArgs.FullPath, eventArgs.ChangeType);
            ReadFile (eventArgs.FullPath);
        }

        private static void ReadFile (string fileName)
        {
            using (var sr = new StreamReader (File.Open (fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) {
                Console.Write (sr.ReadLine ());
            }
        }

        private static void WriteFile (string fileName)
        {
            using (var sr = new StreamWriter (fileName, true)) {
                sr.Write (counter++);
            }
        }
    }
}

【讨论】:

  • 我通过删除和重新创建文件而不是编辑暂时解决了这个问题。现在它可以毫无问题地访问该文件。这是我的输出:pastebin.com/sgGCK6Md
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多