分類:[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();
}
}
}