FileSystemWatcher vervormt de bestandsnaam

Ik gebruik FileSystemWatcher om .docx -bestanden te detecteren. Bestanden worden gedetecteerd wanneer ze worden geopend, maar de bestandsnaam is altijd "beschadigd".

3 voorbeelden:

  1. Als mijn bestandsnaam: 2711111.docx is, is de bestandsnaam die wordt ontvangen in FileSystemWatcher.Changed is: ~ $ 711111.docx .

  2. Voor bestand: * 2711111_1.docx * Ik krijg de bestandsnaam: * ~ $ 11111_1.docx * Ik kan niet raden wat mijn bestandsnaam zal zijn, dus ik ben op zoek naar een algemene oplossing.

  3. Het bestand bevat/begint met een letter, maar het gebeurt niet.

Hier is mijn code

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)  {...}

Hulp zal zeer gewaardeerd worden :) Bedankt!

4
kan iemand maar één keer worden ontslagen? of meerdere keren wanneer een docx-bestand wordt geopend?
toegevoegd de auteur nawfal, de bron

3 antwoord

Dit is ontworpen door Microsoft Word. Het maakt een verborgen bestand wanneer een gebruiker een document opent. In dat bestand wordt de gebruikersnaam geregistreerd, zodat wanneer iemand anders hetzelfde document probeert te openen, deze een fatsoenlijk bericht krijgt met de mededeling welke gebruiker het document momenteel heeft geopend voor bewerking.

The file name of that hidden file is the original file name with the first two characters replaced with ~$

Normaal zie je dit bestand niet wanneer je de map met Explorer bekijkt, omdat het kenmerk FileAttributes.Hidden is ingeschakeld. Natuurlijk wil je deze bestanden ook negeren, gebruik de eigenschap FileInfo.Attributes om ze te filteren.

5
toegevoegd
Hallo, bedankt voor het antwoord, als ik deze map definieer om te verbergen, dan telkens wanneer ik een bestand open, zou ik de "Create" -functie niet bereiken, is er geen manier om de "echte" naam van het bestand uit te vinden ? ik probeerde het: System.IO.FileInfo info = new System.IO.FileInfo (MyPath); info.Attributes = FileAttributes.Hidden;
toegevoegd de auteur dusm, de bron
hallo, het is alleen dat wanneer ik de naam van het bestand nodig heb, ik de bestandsnaam krijg met ~ $, en dus wil ik de originele bestandsnaam "lokaliseren", zoals getoond aan de menselijke ogen, om het te volgen.
toegevoegd de auteur dusm, de bron
Ik kan die opmerking niet zo goed begrijpen. Je zou zeker niet het set het verborgen attribuut willen hebben, alleen test het.
toegevoegd de auteur Hans Passant, de bron
Wat zou daar het nut van zijn? Het enige dat u weet, is dat iemand een document heeft geopend. Er is niets gemaakt of gewijzigd. Iteratie van de map en zoeken naar een bestandsnaam (minus de eerste 2 tekens) is verder de voor de hand liggende aanpak.
toegevoegd de auteur Hans Passant, de bron

Abonneer u op nog enkele evenementen, zoals hernoemen, en voer hun bestandsnamen uit.

Ik vermoed dat wat je ziet tijdelijke bestandsnamen zijn die worden gewijzigd in de eigenlijke bestandsnaam met een nieuwe naam.

4
toegevoegd

Niet geteste code, maar ik herinner me dat ik de truc als deze eerder deed.

Eerst en vooral wanneer u een bestand opent of een bestand opslaat, zal OnChanged -gebeurtenis (hopelijk) meerdere keren worden geactiveerd. U kunt dus zien dat u op een gegeven moment de juiste bestandsnaam krijgt. Om dat te zien, kunt u de bestandsbestaande functie en enkele andere technieken gebruiken. Leuk of zo:

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
}

Als u niet het vereiste bestand krijgt, kunt u zich abonneren op een andere gebeurtenis, de gebeurtenis Naam wijzigen.

1
toegevoegd