C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 書込み中のファイルの認識


(過去ログ 107 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■63801 / inTopicNo.1)  書込み中のファイルの認識
  
□投稿者/ キーサン (1回)-(2012/10/12(Fri) 16:26:26)

分類:[C#] 

2012/10/12(Fri) 16:27:25 編集(投稿者)
あるフォルダーを監視していて、そこにファイルが書き込まれたら(コピーされてきたら)
そのファイルに処理を行うというアプリを作ろうと考えています。
ところが、そのファイルがコピー完了したことを確認する方法がわからなく困っています。

タイマーで一定時間毎に、フォルダー内の全てのファイルに対して、
FileAttributesやファイルサイズを調べればいいのかと、文末のようなコードを書いて
みましたが、Windows上で時間のかかるサイズの大きいファイルをコピーしても
コピーしている途中のファイルは、ファイルの属性はArchiveのみでしかなく、
サイズはコピー終了後のサイズしかコピー中も取得できませんでした。

書込み(コピー)が完了したことを確認する方法は何かありませんでしょうか?
よろしくお願いします。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string StFolderPath;

        private void button1_Click(object sender, EventArgs e)
        {
            //開くボタン
            if (folderBrowserDialog1.ShowDialog()==DialogResult.OK)
            {
                //選択されたフォルダーのパスを保存
                StFolderPath = folderBrowserDialog1.SelectedPath;
                //タイマースタート
                timer1.Enabled = true;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // 必要な変数を宣言する
            string stPrompt = string.Empty;

            // 拡張子が .txt のファイルを列挙する
            foreach (string stFilePath in System.IO.Directory.GetFiles(StFolderPath, "*.*"))
            {
                // ファイルの属性を取得する
                System.IO.FileAttributes uAttribute = System.IO.File.GetAttributes(stFilePath);
                string attribute = "";
                attribute = ((uAttribute & FileAttributes.Archive) != 0) ? "A" : "-";
                attribute += ((uAttribute & FileAttributes.ReadOnly) != 0) ? "R" : "-";
                attribute += ((uAttribute & FileAttributes.Hidden) != 0) ? "H" : "-";
                attribute += ((uAttribute & FileAttributes.System) != 0) ? "S" : "-";
                attribute += ((uAttribute & FileAttributes.Directory) != 0) ? "D" : "-";
                attribute += ((uAttribute & FileAttributes.Compressed) != 0) ? "C" : "-";
                attribute += ((uAttribute & FileAttributes.Normal) != 0) ? "N" : "-";
                attribute += ((uAttribute & FileAttributes.Offline) != 0) ? "O" : "-";
                attribute += ((uAttribute & FileAttributes.SparseFile) != 0) ? "P" : "-";
                attribute += ((uAttribute & FileAttributes.Temporary) != 0) ? "T" : "-";

                //サイズを取得する
                string size;
                FileInfo sizeInfo = new FileInfo(stFilePath);
                size = sizeInfo.Length.ToString();

                stPrompt += Path.GetFileName(stFilePath) + "\t" + attribute + "\t" + size + System.Environment.NewLine;
            }

            //ファイルの情報をtextbox1に書き込む
            textBox1.Text = stPrompt;

            //確認した時間をtextbox2に書き込む
            textBox2.Text = System.DateTime.Now.ToString();
        }
    }
}

引用返信 編集キー/
■63804 / inTopicNo.2)  Re[1]: 書込み中のファイルの認識
□投稿者/ みきぬ (6回)-(2012/10/12(Fri) 17:50:52)
FileSystemWatcher クラスのイベントを使えば、監視については楽できる。
ただ、それで問題が解決するかどうかはわからない(使ったことがないので)

一番確実なのは、ファイルを書き込んだ側の処理から通知してもらうことだと思う。
引用返信 編集キー/
■63810 / inTopicNo.3)  Re[1]: 書込み中のファイルの認識
□投稿者/ 渋木宏明 (22回)-(2012/10/12(Fri) 22:16:29)
渋木宏明 さんの Web サイト
> 書込み(コピー)が完了したことを確認する方法は何かありませんでしょうか?

いかなる場合にも対応できる確実な方法はありません。
書き込みが完了した後に追記されることもあるでしょうし。

なので、シナリオに応じて確認を方法を定めるしかないです。

>一番確実なのは、ファイルを書き込んだ側の処理から通知してもらうことだと思う。

も有力候補の1つです。

あるいは、ファイル作成を検知したら定期的にポーリングをして、ファイルサイズやタイムスタンプが一定期間変化しないようなら「完了」とみなす、とかですね。
引用返信 編集キー/
■63812 / inTopicNo.4)  Re[1]: 書込み中のファイルの認識
□投稿者/ 魔界の仮面弁士 (65回)-(2012/10/13(Sat) 03:00:31)
No63801 (キーサン さん) に返信
> ところが、そのファイルがコピー完了したことを確認する方法がわからなく困っています。

相手側のプログラムに手を加えられるなら、「*.txtファイルを配置してもらう」のではなく、
別の拡張子ファイル名でコピーしてもらうようにし、コピー後に正しい名前(.txt)に
リネームしてもらうというのはどうでしょう。
引用返信 編集キー/
■63813 / inTopicNo.5)  Re[2]: 書込み中のファイルの認識
□投稿者/ オショウ (29回)-(2012/10/13(Sat) 03:12:36)
ファイルがロックされているのを確認する方法があるので、
Write中なのか、Closeされたのか判断する方法はあると思い
ます。

ただWindowsのファイルシステム、そこまで柔軟に動作する
のかは疑問ですが。

一応、参考と言うことで。
引用返信 編集キー/
■63834 / inTopicNo.6)  Re[3]: 書込み中のファイルの認識
□投稿者/ キーサン (2回)-(2012/10/16(Tue) 09:51:27)
みなさん、ありがとうございます。

今回の案件は、CADのプロッタ出力をするのに、
「CADはファイルを吐き出すだけで、あとはユーザーにお任せします」
などと言われていて、困ってしまっていました。
机上の実験で、Windowsのコピーコマンドで実験をしていましたら、
コピーの最初のファイル作成時から、コピー完了時までファイルサイズが
変わらなかったので困ってしまいました。
ただ、本日CADのツールで吐き出してみると、ファイルサイズがどんどん
大きくなることがわかりました。
また、みきぬさんにご紹介いただいたFileSystemWatcherクラスを使用すると、
ファイルの吐き出し時の最初にCreatedイベントが発生し、吐き出しが完了後に
Changedイベントが複数回(なぜか複数回なのです・・・)が発生していることが
わかりました。

皆様のお陰様で、ファイルの吐き出し時の知識が増えましたので、
もう一度CADメーカーとお話をしてみたいと思います。
ありがとうございました。
解決済み
引用返信 編集キー/
■63836 / inTopicNo.7)  Re[4]: 書込み中のファイルの認識
□投稿者/ オショウ (31回)-(2012/10/16(Tue) 19:06:59)
> ただ、本日CADのツールで吐き出してみると、ファイルサイズがどんどん
> 大きくなることがわかりました。
> また、みきぬさんにご紹介いただいたFileSystemWatcherクラスを使用すると、
> ファイルの吐き出し時の最初にCreatedイベントが発生し、吐き出しが完了後に
> Changedイベントが複数回(なぜか複数回なのです・・・)が発生していることが
> わかりました。

  どうも分割保存しているようですネ!
  2回目以降はアペンドモードで保存・・・

  そういう場合は厄介です。
  FileSystemWatcherで監視し、完全にクローズされたかは、ロック確認
  で2重に行う・・・なんてことをしないといけないかも。です。

※ itaro3の掲示板にお出入りの方ですか?
  違ったらすいません。(掲示板をお借りしてしまいました)

以上。
引用返信 編集キー/
■63838 / inTopicNo.8)  Re[5]: 書込み中のファイルの認識
□投稿者/ キーサン (3回)-(2012/10/18(Thu) 11:29:24)
オショウさんこんにちは!
いつもお世話になっています。

CADメーカーに問い合わせると「普通に書き出しているだけですが・・・」
との回答でした。
で、じゃあどうすればいいの?って聞いたら、
「一般的な方法として、リネームをしてみて、できれば完了しているし、
 できなければ書込み中という方法があります。」
との回答でした。
とりあえず、ファイルを同じ名前にリネーム(同じ場所・同じ名前にMove)
してみました。
一番最初のコードの中に下記コードを入れてみました。

//サイズを取得する
string size;
FileInfo sizeInfo = new FileInfo(stFilePath);
size = sizeInfo.Length.ToString();

//リネームをしてみる
string stFinish = "○";
try
{
sizeInfo.MoveTo(stFilePath);
}
catch
{
//リネームできなければstFinishに×が入る。
stFinish = "×";
}

確かに、CADからの出力や、Windowsのコピー中でもstFinishの中に×が入り
それ以外の時には○が入っていました。
とりあえず、CADメーカーがそういうのだから、それでやってみようかと
思っています。うまくいかない時に文句を言うことができますし・・・(苦笑)


> ※ itaro3の掲示板にお出入りの方ですか?
>   違ったらすいません。(掲示板をお借りしてしまいました)

はい!
ここの掲示板や、FA屋の溜まり場でも、いつもお世話になっております。
(オショウさんのHNを見て、皆同じ人と勝手に思い込んでおりますが違ったら本当にごめんなさい)
私は電気なのですが、PLCの合間に画像処理をパソコンで・・・なんてことを
やっております。主はPLCなのでパソコン関係はまだまだです。
これからもよろしくお願いします!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -