0

Windows サービスの FileSystemWatcher によって処理される StreamReader を使用して、ファイルの行を読み取れるようにする必要があります。

オンラインで意味のあるものをすべて読んで試しましたが、それでも機能しません。Windows サービス プロセス (Visual Studio 2010 を使用するローカル マシン) に接続すると、すべてが問題なく動作します。

アタッチしてデバッグせずに (ローカル マシンで) 実行しようとすると、2 番目のファイルが処理されず、次のメッセージが表示されます。 \20121213_AZM_Journey_MIS.txt' は別のプロセスで使用されているためです。" このファイルを自分のマシンの他の場所で開いていません。ディレクトリに座っているだけです。次に、それをディレクトリにコピーすると、FSW が引き継ぎます (および以下のコード)。

誰かがこれを機能させるために何をする必要があるか教えてもらえますか? 接続してデバッグするとうまく動作する理由はわかりませんが、接続してデバッグせずにファイルを送信すると動作しません。無効にする必要があるのは間違いなくローカルボックスにあると感じています---わかりません.....

「using」ステートメントに入る前でもエラーが発生することに気付きました。これは、2 番目のファイルが処理のために一時ディレクトリにコピーされることがないためです。

StackTrace で次のエラーが発生していることに気付きました: system.io.__error.winioerror(int32 errorcode string Maybefullpath)

これが私のコードです:

protected override void OnStart(string[] args)
        {
            FileSystemWatcher Watcher = new FileSystemWatcher(@"C:\Projects\Data\VendingStats");
            Watcher.EnableRaisingEvents = true;
            Watcher.Created += new FileSystemEventHandler(Watcher_Created);
            Watcher.Filter = "*.txt";
            Watcher.IncludeSubdirectories = false;
        }

private void Watcher_Created(object sender, FileSystemEventArgs e)
        {
            try
            {
                string targetPath =  @"C:\Temp\VendorStats";

                // Use Path class to manipulate file and directory paths. 
                FileInfo fi = new FileInfo(e.FullPath); // full name of path & file in the FSW directory
                string destFile = Path.Combine(targetPath, fi.Name);

                // To copy a folder's contents to a new location: 
                // Create a new target folder, if necessary. 
                if (!Directory.Exists(targetPath))
                    Directory.CreateDirectory(targetPath);

                // To copy a file to another location and  
                File.Copy(e.FullPath, destFile, true);

                // Set attribute to READONLY
                if (fi.IsReadOnly == false)
                    fi.Attributes = FileAttributes.ReadOnly;

                GetCruiseLineShipName(destFile, ref cruiseLine, ref shipName);

                using (StreamReader sr = new StreamReader(File.Open(destFile, FileMode.Open, FileAccess.Read, FileShare.Read)))
                {
                    filename = e.FullPath;

                    //How many lines should be loaded?
                    int NumberOfLines = 39;

                    //Read the number of lines and put them in the array
                    for (int i = 1; i < NumberOfLines; i++)
                    {
                        ListLines[i] = sr.ReadLine();
                        switch (i)
                        {
                            case 3:
                                int idx = ListLines[i].IndexOf(":");
                                string timeLine = ListLines[i].Substring(idx + 1);
                                dt = GetDate(Convert.ToDateTime(timeLine.Substring(1)));
                                break;

                            //more code here of the same                        
                        }
                    }
                    //InsertData into database                }
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("VendorStats", "Error in the Main:" + "\r\n\r\n" + ex.Message + "\r\n\r\n" + ex.InnerException);
                return;
            }
        }
4

1 に答える 1

0

これを解決するための重要な点は、Windowsが以前のファイルと現在のファイルおよびフォルダーにリソースを完全に解放するまで、メソッド(FileSystemWatcherによって生成された)を「X」秒間スリープ状態にすることでした。

実際にリソースを保持していたのはFileSystemWatcherでした。

サンプルコードは次のとおりです。

private static void Watcher_Created(object sender, FileSystemEventArgs e)
        {
            try
            {
                Thread.Sleep(10000);

                GetCruiseLineShipName(e.FullPath, ref cruiseLine, ref shipName);

                using (StreamReader sr = new StreamReader(File.Open(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read)))
                { 
于 2012-12-19T18:26:44.990 に答える