2010-02-11 26 views
20

Ich benutze den TextWriter, um zu versuchen, in eine versteckte Datei zu schreiben, und es wird eine Ausnahme ausgelöst. Ich kann nicht herausfinden, wie ich in eine versteckte Datei schreiben soll.Wie schreibe ich in eine versteckte Datei?

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

Ausnahme:

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

Wie kann ich auf eine versteckte Datei schreiben?

+2

Welche Ausnahme? – tadman

+0

Was ist die Ausnahme, die es wirft? –

+1

Welche Ausnahme wirft es? – Seth

Antwort

17

EDIT 2: Diese Antwort löst das Problem, ist aber nicht der richtige Weg, um mit dem Problem umzugehen. Sie sollten nach Luceros Antwort suchen.


Nahm diese Antwort aus: http://www.dotnetspark.com/Forum/314-accessing-hidden-files-and-write-it.aspx

1- Set-Datei als sichtbar, so kann es

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

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

2- Änderungen an der Datei vornehmen

// Do foo... 

3 überschrieben werden - Datei als versteckt einstellen

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

EDIT: fixed ich ein Problem auf meiner Antwort erwähnt, wie durch briler

+0

@Lucero erwähnt habe ich meine Antwort –

+3

unsetting das versteckte Attribut und dann zurückgesetzt nach Ihnen versteckt ' In die Akte geschrieben ist so viele Probleme. Verwenden Sie einfach eine der FileStream-Überladungen, die dies richtig behandelt, wie in @Lucero-Antwort erwähnt. – enorl76

+0

sehen Sie die Antwort von @Lucero es gibt keine Notwendigkeit, Attribute zu ändern, um in eine versteckte Datei zu schreiben. – SergeyT

0

Wenn das eine Option für Sie ist, können Sie versuchen, File.SetAttributes zu verwenden, um das ausgeblendete Attribut vorübergehend zu entfernen, Ihre Arbeit zu erledigen und es dann auf den vorherigen Zustand zurückzusetzen.

+0

schlechte Option, wie ich auf einer anderen Antwort – enorl76

0

Sie die Datei vor dem Schreiben in sie und nach vollständigem Schreib verbirgt sichtbar machen können es wieder.

0

Sobald Sie eine Datei geöffnet haben, können Sie ihre Attribute ändern (einschließlich nur zum Lesen) und mit dem Schreiben fortfahren. Dies ist eine Möglichkeit, um zu verhindern, dass eine Datei von anderen Prozessen überschrieben wird.

Es scheint also möglich zu sein, die Datei sichtbar zu machen, sie zu öffnen und sie dann auf versteckt zurückzusetzen, selbst wenn sie geöffnet ist.

Zum Beispiel der folgende Code funktioniert:

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 
} 

Beachten Sie, dass die Datei verborgen bleibt, während der Prozess, um es schreibt.

+0

Falsche Option. Wenn zwischen dem Deaktivieren des ausgeblendeten Attributs und dem Zurücksetzen des ausgeblendeten Attributs etwas passiert, haben Sie den Status der Datei unnötigerweise geändert. Verwenden Sie einfach eine Überladung von FileStream ctor. – enorl76

30

Es scheint, dass das Problem ist, dass eine Art von File.Exists() Überprüfung intern erfolgt, die fehlschlägt, wenn die Datei ausgeblendet ist (z. B. versucht, eine FileMode.Create für eine Datei, die bereits existiert).

Verwenden Sie daher FileMode.OpenOrCreate um sicherzustellen, dass die Datei geöffnet oder erstellt wird, auch wenn es ausgeblendet ist, oder nur FileMode.Open, wenn Sie es nicht erstellen möchten, wenn es nicht vorhanden ist.

Wenn FileMode.OpenOrCreate zwar verwendet wird, wird die Datei nicht abgeschnitten, daher sollten Sie ihre Länge am Ende einstellen, um sicherzustellen, dass nach dem Ende des Textes kein Rest übrig bleibt.

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

Wenn Sie .NET 4 verwenden.5 oder später, gibt es eine neue Überlastung, die die Beseitigung der StreamWriter verhindert auch den zugrunde liegenden Strom zu entsorgen. Der Code könnte dann wie folgt slighly intuitiver geschrieben werden:

using (FileStream fs = new FileStream(filename, FileMode.Open)) { 
    using (TextWriter tw = new StreamWriter(fs, Encoding.UTF8, 1024, false)) { 
    // 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); 
} 
+4

Upvoted, weil dies die richtige Operation ist ... nicht "die Datei einblenden, schreiben und dann wieder verstecken" Prozess – enorl76

+1

Vielen Dank für die Klärung, warum genau dies passiert, da ich nicht gesehen habe, wie ein "verstecktes" Attribut betroffen ist Dateiberechtigungen. –

+0

@DaveVandenEynde, gern geschehen. Leider scheinen die meisten Leute, die diese Frage besuchen, nicht zu erkennen, dass das Ändern der Attribute hin und her nicht wirklich eine Lösung ist, sondern nur ein sprunghafter Workaround. – Lucero

9

Edit: Pierre-Luc Champigny Antwort war inccorect, aber jetzt behoben nach mir, Ich lasse es hinter als Referenz

myFile.Attributes |= FileAttributes.Normal; 

entfernt nicht das ausgeblendete Attribut aus der Datei. um unhidden Attribut Verwendung zu entfernen:

FileInfo .Attributes &= ~FileAttributes.Hidden; 

Dieser Code prüft, ob die Datei, um sie es unhidden machen existiert. vor dem Schreiben einmal fertig stellen Sie es als wieder versteckt. ich auch die normalen Attribut, falls gesetzt die nicht existieren - Sie müssen es nicht verwenden

// 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; 
+1

Nun, ich habe das Problem auf meine Antwort behoben, tut mir leid, dass –

+0

Warum die Datei an erster Stelle? Sie ändern den Status der Datei. – enorl76

+0

Da Sie normalerweise eine UnauthorizedAccessException erhalten, lesen Sie die erste Frage. – briler

Verwandte Themen