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;
}
}