2009-03-18 18 views
13

Ich muss mit einigen temporären Dateien in meiner Windows Forms .NET 3.5-Anwendung arbeiten. Diese Dateien werden in einer externen Anwendung geöffnet, die natürlich länger laufen kann als mein eigenes Programm.Temporäre Dateien nach der Verwendung löschen

Gibt es Best Practices, um sicherzustellen, dass diese temporären Dateien jederzeit bereinigt werden, um zu vermeiden, dass die Festplatte des Benutzers mit "Junk" -Dateien gefüllt wird, die nicht mehr benötigt werden? Oder behandelt das sogar Windows automatisch?

Ein nettes Beispiel ist ein Mail-Client: Wenn Sie eine Anlage in einer Anwendung öffnen, wird sie normalerweise in eine temporäre Datei geschrieben, die geöffnet wird. Gibt es eine Möglichkeit, herauszufinden, wie diese Dateien die Bereinigung verwalten?

Die Verwendung von Google hat mir viele, viele Aufräum- und Optimierungs-Tools gezeigt, um das temporäre Verzeichnis von Hand zu säubern, aber ich möchte die Benutzer nicht dazu zwingen. :-)

Jede Hilfe wird geschätzt.

Matthias

Antwort

5

Wenn Sie den Inhalt eines temporären Dateien Typ Ordner zu deterministisch löschen versuchen, riskieren Sie Dateien zu entfernen, die von anderen Prozessen verwendet werden. Das Windows-Betriebssystem stellt Tools bereit, mit denen Benutzer diese Dateien entfernen können, wenn der verfügbare Speicherplatz des Volumes einen bestimmten Schwellenwert erreicht.

Wenn Sie jetzt feststellen können, dass nach dem Verwenden einer bestimmten temporären Datei, dass sie nicht mehr benötigt wird, gibt es keine Nachteile beim Löschen dieser spezifischen Datei.

+0

Ja, atm Ich fange das Process 'Exit-Event, um Dateien, die nicht mehr benötigt werden, sicher zu löschen ... also, ist es gute Praxis, den Benutzer zu "ermutigen", das Windows Disk Cleanup Tool zu verwenden? :) –

27

In .NET können Sie die TempFileCollection Klasse für die Verwaltung einer Reihe von temporären Dateien verwenden, die von Ihrer Anwendung bereinigt werden (Beachten Sie, dass sie eher im CodeDom-Namespace verborgen ist). Natürlich können Sie keine Dateien löschen, die Sie nicht besitzen, da die Dateien möglicherweise noch von einer anderen Anwendung geöffnet werden (und das Löschen dieser Dateien zu ernsthaften Problemen führen kann).

+0

TempFileCollection-Klasse? Heiß! –

+8

In der Tat ;-) Ich weiß nicht, warum diese Klasse so gut versteckt ist. Wenn nicht zufällig würden Sie es nicht finden ... –

+0

Wow, nicht mehr handgerollte Lösungen, scheint wie Microsoft implementiert alles 2 Jahre, nachdem wir es brauchen;) – invert

1

Ich glaube, sie werden gelöscht, wenn der Benutzer abmeldet.

Damals, als die Leute jeden Tag ihren PC ausschalteten, war das wahrscheinlich eine perfekte Lösung.

Jetzt können die Leute möglicherweise Monate ohne Abmeldung gehen, also ist es vielleicht keine gute Idee, sich darauf zu verlassen.

Wenn sie ihre Maschine ausschalten, ohne herunterzufahren, werden die Dateien auch nicht gelöscht.

Sie können einen Dateisystembeobachter verwenden, der die von Ihnen geschriebene Datei überwacht und einige Inaktivitätszeiten (10 Minuten, 1 Stunde, 1 Tag oder was auch immer) wartet und dann die Datei löscht.

Das wird aber nicht für alles funktionieren. Einige Programme haben möglicherweise eine Datei "open", aber die zugrunde liegende Datei ist möglicherweise nicht gesperrt. Wenn das passiert, hätten Sie keine Möglichkeit zu wissen, wann die Datei sicher gelöscht werden kann.

Allerdings denke ich, dass Sie wahrscheinlich einfach das Problem ignorieren können. Die meisten Leute haben wahrscheinlich sowieso einen Überschuss an Festplattenspeicher, so dass sie wahrscheinlich nicht darauf stoßen werden. Wenn das der Fall ist, denke ich, dass Windows einen Dialog mit wenig Speicherplatz öffnet, der ihnen die Möglichkeit gibt, ihr temporäres Verzeichnis zu löschen, wodurch das Problem gelöst würde.

Update:

denke ich Windows Update den Computer des Benutzers etwa einmal im Monat neu zu starten, so sollten die temporären Dateien gelöscht werden, wenn das passiert.

Es gibt keine Garantie, dass es keine Probleme geben wird, aber in der Praxis denke ich, dass es ziemlich selten sein sollte.

Update 2:

durch einen Kommentar Angeregt, ging ich und dies tatsächlich getestet, und es sieht aus wie Fenster, um die temporären Dateien nicht gelöscht, wenn der Benutzer abmeldet. Ich sage jedoch immer noch, dass dies im OP kein echtes Problem ist. Wenn ein Problem auftritt (weil der Festplattenspeicherplatz niedrig ist), fordert Windows den Benutzer auf, temporäre Dateien zu löschen.

+0

Sie möchten sich auf ein Windows-Update verlassen? Und dass das Update einen Neustart erfordert? Und dass der Benutzer das automatische Starten von Updates nicht deaktiviert hat? – Martin

+0

Ich sage, dass es keine große Sache ist, wenn Sie Sachen im Temp-Ordner lassen. Es gibt verschiedene Möglichkeiten, wie Windows die Dateien automatisch löscht. Auch wenn es nicht ist, ist es nur ein Problem, wenn der Speicherplatz knapp wird. Wenn das passiert, sieht der Benutzer einen Dialog, der sagt "Hier ist, wie das zu beheben ist". –

+0

In einer Standardkonfiguration bereinigt Windows keine Dateien aus Ihrem temporären Ordner (es sei denn, Sie führen Cleanmgr.exe aus, wenn Sie die Sprechblase erhalten, dass Ihr Laufwerk nicht genügend freien Speicherplatz hat, aber ich würde dieses automatische nicht aufrufen) . –

6

Die Verantwortung für die Bereinigung von temporären Dateien sollte auf der Anwendung, die sie erstellt hat, liegen. Es ist sehr leicht. Ich benutze eine Klasse, die etwa wie folgt aussieht:

public class TempFile : IDisposable 
{ 
    public TempFile() 
    { this.path = System.IO.Path.GetTempFileName(); } 

    public void Dispose() 
    { File.Delete(path); } 

    private string path; 
    public string Path { get { return path; } } 
} 

Wenn Sie verpflichtet sind, eine andere Anwendung temporäre Dateien zu bereinigen, braucht es einige Mittel, mit Ihnen zu kommunizieren. Zumindest sollte es in der Lage sein, einen Semaphor bereitzustellen. Die Komplexität dabei ist jedoch größer als die Komplexität, nur die ursprüngliche Anwendung für ihre eigenen Dateien zu sorgen.

2

Wir haben ein ähnliches Problem mit der Dateilebensdauer - die Anwendung (winforms) kann ein Dokument aus einem zentralen Repository-Speicher abrufen, aber der Benutzer sollte unsere App schließen können, ohne dass sich dies auf die angezeigte Datei auswirkt . Aus Sicherheitsgründen müssen die Dokumentdateien aufgeräumt werden, damit sie nicht zu lange herumliegen.

Die Lösung, die wir verwenden, besteht darin, einen Ordner mit einem vom Datum abgeleiteten Namen im isolierten Speicherbereich der Benutzer zu erstellen und diesen als heutigen Cache zu verwenden. Beim Schließen und Starten der Anwendung suchen wir nach älteren Cache-Ordnern und löschen sie (und den Inhalt).

1

Wenn Sie temporäre Dateien in ASP.NET verwenden, löschen Sie mit dem Ereignis PAGE_DISPOSED alle temporären Dateien, die Sie auf der Seite erstellt haben. Andernfalls könnte es zu Konflikten mit Komponenten kommen, die erst ENTSORGT gehen.

0
  • Sie eine temporäre Datei erstellen können, in dem Sie die Dateinamen während des Prozesses erstellt Schreiben halten, kann sich am Ende der Verarbeitung sein können (Voraussetzung - Umsetzung IDisposable und) löschen im Disponse Verfahren nach Der Vorgang ist abgeschlossen.

  • Eine andere Möglichkeit ist ein schreibunabhängiger Prozess, der jedes Intervall aufräumt.

  • Attach das Datum am Ende der Datei, und löschen Sie am Ende des Tages mit diesem Datum, und der Prozess erzeugt neue Dateien mit neuen Datum am Ende.

  • ein guter Vorschlag von divo tempfilecollection Klasse gegeben.

hoffe es hilft.

1

Ich benutze diese Lösung (sehr zuverlässig):

using System.IO; 
using System.Reflection; 

namespace Konard.Helpers 
{ 
    public static partial class TemporaryFiles 
    { 
     private const string UserFilesListFilenamePrefix = ".used-temporary-files.txt"; 
     static private readonly object UsedFilesListLock = new object(); 

     private static string GetUsedFilesListFilename() 
     { 
      return Assembly.GetEntryAssembly().Location + UserFilesListFilenamePrefix; 
     } 

     private static void AddToUsedFilesList(string filename) 
     { 
      lock (UsedFilesListLock) 
      { 
       using (var writer = File.AppendText(GetUsedFilesListFilename())) 
        writer.WriteLine(filename); 
      } 
     } 

     public static string UseNew() 
     { 
      var filename = Path.GetTempFileName(); 
      AddToUsedFilesList(filename); 
      return filename; 
     } 

     public static void DeleteAllPreviouslyUsed() 
     { 
      lock (UsedFilesListLock) 
      { 
       var usedFilesListFilename = GetUsedFilesListFilename(); 

       if (!File.Exists(usedFilesListFilename)) 
        return; 

       using (var listFile = File.Open(usedFilesListFilename, FileMode.Open)) 
       { 
        using (var reader = new StreamReader(listFile)) 
        { 
         string tempFileToDelete; 
         while ((tempFileToDelete = reader.ReadLine()) != null) 
         { 
          if (File.Exists(tempFileToDelete)) 
           File.Delete(tempFileToDelete); 
         } 
        } 
       } 

       // Clean up 
       using (File.Open(usedFilesListFilename, FileMode.Truncate)) { } 
      } 
     } 
    } 
} 

Jedes Mal, wenn Sie temporäre Datei verwenden müssen:

var tempFile = TemporaryFiles.UseNew(); 

Um sicherzustellen, dass alle temporären Dateien gelöscht werden, nach der Anwendung schließt oder Abstürze setzen

TemporaryFiles.DeleteAllPreviouslyUsed(); 

zu Beginn der Anwendung.

Verwandte Themen