Question

J'utilise le TextWriter pour essayer d'écrire dans un fichier caché, et il jette une exception. Je ne peux pas sembler comprendre comment écrire dans un fichier caché.

using (TextWriter tw = new StreamWriter(filename))
{
    tw.WriteLine("foo");
    tw.Close();
}

Exception:

Unhandled Exception: System.UnauthorizedAccessException: 
Access to the path 'E:\*\media\Photos\2006-08\.picasa.ini' is denied.

Comment puis-je écrire dans un fichier caché?

Était-ce utile?

La solution

EDIT 2: Cette réponse résoudre le problème, mais pas la bonne façon de traiter le problème. Vous devriez chercher la réponse de Lucero.


A pris cette réponse de: http: / /www.dotnetspark.com/Forum/314-accessing-hidden-files-and-write-it.aspx

1- Définir fichier comme visible il peut être écrasé

// Get file info
FileInfo myFile= new FileInfo(Environment.CurrentDirectory + @"\hiddenFile.txt");

// Remove the hidden attribute of the file
myFile.Attributes &= ~FileAttributes.Hidden;

2- Modifiez le fichier

// Do foo...

3- fichier rétrogradé à caché

// Put it back as hidden
myFile.Attributes |= FileAttributes.Hidden;

EDIT: je fixe un problème sur ma réponse tel que signifié par briler

Autres conseils

Il semble que le problème est ce genre d'un chèque de File.Exists() est fait en interne, qui échoue si le fichier est caché (par exemple essaie de faire un FileMode.Create sur un fichier qui existe déjà).

Par conséquent, utilisez FileMode.OpenOrCreate pour vous assurer que le fichier est ouvert ou créé, même si elle est cachée, ou tout simplement FileMode.Open si vous ne voulez pas créer si elle n'existe pas.

Lorsque FileMode.OpenOrCreate est utilisé cependant, le fichier ne sera pas tronqué, vous devez donc définir sa longueur à la fin pour vous assurer qu'il n'y a pas de surplus après la fin du texte.

using (FileStream fs = new FileStream(filename, FileMode.Open)) {
  using (TextWriter tw = new StreamWriter(fs)) {
    // Write your data here...
    tw.WriteLine("foo");
    // Flush the writer in order to get a correct stream position for truncating
    tw.Flush();
    // Set the stream length to the current position in order to truncate leftover text
    fs.SetLength(fs.Position);
  }
}

Si vous utilisez .NET 4.5 ou plus tard, il y a une nouvelle surcharge qui empêche la disposition du StreamWriter de disposer également le flux sous-jacent. Le code pourrait alors être écrit de manière plus intuitive slighly comme ceci:

using (FileStream fs = new FileStream(filename, FileMode.Open)) {
  using (TextWriter tw = new StreamWriter(fs, Encoding.UTF8, 1024, true)) {
    // Write your data here...
    tw.WriteLine("foo");
  }
  // Set the stream length to the current position in order to truncate leftover text
  fs.SetLength(fs.Position);
}

Edit: Pierre-Luc Champigny réponse était inccorect, mais maintenant fixé en fonction de la mienne, Je laisse derrière comme référence

myFile.Attributes |= FileAttributes.Normal;

ne supprime pas l'attribut caché du fichier. afin d'éliminer l'utilisation de l'attribut unhidden:

FileInfo .Attributes &= ~FileAttributes.Hidden; 

Ce code vérifie si le fichier existe, il faire unhidden. avant d'écrire une fois terminé, il la définir comme nouveau caché. J'ai également mis l'attribut normal dans le cas où le n'existait pas - vous ne devez pas utiliser

// if do not exists it creates it.
FileInfo FileInfo = new FileInfo(FileName);
if (true == FileInfo .Exists)
{
   // remove the hidden attribute from the file
   FileInfo .Attributes &= ~FileAttributes.Hidden; 
} //if it doesn't exist StreamWriter will create it
using (StreamWriter fileWriter = new StreamWriter(FileName))
{
   fileWriter.WriteLine("Write something");
}
 // set the file as hidden
FileInfo.Attributes |= FileAttributes.Hidden;

Si c'est une option pour vous, vous pouvez essayer d'utiliser File.SetAttributes pour supprimer l'attribut caché temporairement, faire votre travail, puis le remettre à l'état précédent.

Vous pouvez réafficher le fichier avant d'écrire dans et après l'écriture de peau complète à nouveau.

Une fois que vous avez ouvert un fichier, vous pouvez modifier ses attributs (y compris en lecture seule) et continuer à écrire à elle. Ceci est une façon d'empêcher un fichier d'être remplacée par d'autres processus.

Il semble possible de réafficher le fichier, ouvrez-le, puis le remettre à caché, même pendant que vous l'avez ouvert.

Par exemple, le code suivant fonctionne:

public void WriteToHiddenFile(string fname)
{
    TextWriter    outf;
    FileInfo      info;  

    info = new FileInfo(fname);
    info.Attributes = FileAttributes.Normal;    // Set file to unhidden
    outf = new StreamWriter(fname);             // Open file for writing
    info.Attributes = FileAttributes.Hidden;    // Set back to hidden
    outf.WriteLine("test output.");             // Write to file
    outf.Close();                               // Close file
}

Notez que le fichier reste caché alors que le processus lui écrit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top