4

.docxファイルFileSystemWatcherの検出に使用しています。ファイルは開いているときに検出されますが、ファイル名は常に「破損」しています。

3つの例:

  1. 私のファイル名が:2711111.docxの場合、受信したファイル名FileSystemWatcher.Changedは:〜$711111.docxです。

  2. ファイルの場合:* 2711111_1.docx *ファイル名を取得します:*〜$ 11111_1.docx *ファイル名がどうなるかわからないので、一般的な解決策を探しています。

  3. ファイルに文字が含まれている/文字で始まっている場合、それは発生しません。

これが私のコードです

MyPath = String.Format(@"C:\Users\{0}\NRPortbl\ACTIVE\{1}\"", 
         Public.UserName, Public.UserName);

FileSystemWatcher watcher = new FileSystemWatcher();
if (!System.IO.Directory.Exists(MyPath))
{
    Public.Logger.Error(
        String.Format
            ("Path of folders {0} not found", MyPath));
    System.Windows.Forms.MessageBox.Show(
        String.Format(
            "There was a problem loading {0} " + 
            "NRPortbl libraray, contact administrator", Public.UserName));
    return;
}
watcher.Path = MyPath;
watcher.Filter = "*.Docx";                                                      
watcher.IncludeSubdirectories = false;
watcher.Changed += new FileSystemEventHandler(OnChanged);                       
watcher.Deleted += new FileSystemEventHandler(OnDeleted);
watcher.EnableRaisingEvents = true;  ... 
public void OnChanged(object source, FileSystemEventArgs e)  {...}

ヘルプは大歓迎です:)ありがとう!

4

3 に答える 3

5

これはMicrosoftWordの設計によるものです。ユーザーがドキュメントを開くと、隠しファイルが作成されます。そのファイルにはユーザー名が記録されているため、他の誰かが同じドキュメントを開こうとすると、現在どのユーザーがドキュメントを編集用に開いているかを示す適切なメッセージが表示されます。

その隠しファイルのファイル名は、最初の2文字が置き換えられた元のファイル名です。~$

このファイルはFileAttributes.Hidden属性がオンになっているため、エクスプローラーでディレクトリを見ると通常は表示されません。確かに、これらのファイルも無視したい場合は、FileInfo.Attributesプロパティを使用してそれらをフィルタリングします。

于 2012-06-24T10:42:15.967 に答える
4

名前の変更など、さらにいくつかのイベントをサブスクライブし、それらのファイル名を出力します。

あなたが見ているのは一時的なファイル名であり、名前を変更して実際のファイル名に変更されているのではないかと思います。

于 2012-06-24T10:26:22.240 に答える
1

テストされていないコードですが、私は以前にこのようなトリックを行ったことを覚えています。

まず、ファイルを開いたりファイルを保存したりすると、OnChangedイベントが(うまくいけば)複数回発生します。したがって、ある時点で正しいファイル名を取得していることがわかります。これを確認するには、fileexists関数と他のいくつかの手法を使用できます。このように:

public void OnChanged(object source, FileSystemEventArgs e) 
{
     if (e.FullPath.Contains("~$")) //to avoid the corruption you are talking about.
         return;                    //or better handling - trivial

     if (!File.Exists(e.FullPath)) //to avoid some temp files that need not be visible
         return;                   //but happens with doc files. 

     //got the file e.FullPath
}

必要なファイルを取得できない場合は、別のイベントである名前変更イベントをサブスクライブできます。

于 2012-06-24T10:33:37.633 に答える