40 votes

Comportement des fichiers temporaires de Windows - sont-ils supprimés par le système ?

En utilisant le cadre .net, vous avez la possibilité de créer des fichiers temporaires avec les éléments suivants

Path.GetTempFileName();

Le MSDN ne nous dit pas ce qu'il advient des fichiers temporaires. Je me souviens avoir lu quelque part qu'ils sont supprimés par le système d'exploitation lors d'un redémarrage. Est-ce vrai ?

Si les fichiers ne sont pas supprimés par l'OS, pourquoi sont-ils appelés temporaires ? Ce sont des fichiers normaux dans un répertoire normal.

42voto

Cristi Diaconescu Points 7955

La réponse courte : ils ne sont pas supprimés.

La réponse longue : La gestion Path.GetTempFileName() appelle la méthode native Win32API GetTempFileName() comme ceci :

//actual .NET 2.0 decompiled code 
// .NET Reflector rocks for looking at plumbing
public static string GetTempFileName()
{
    string tempPath = GetTempPath();
    new FileIOPermission(FileIOPermissionAccess.Write, tempPath).Demand();
    StringBuilder tmpFileName = new StringBuilder(260);
    if (Win32Native.GetTempFileName(tempPath, "tmp", 0, tmpFileName) == 0)
    {
        __Error.WinIOError();
    }
    return tmpFileName.ToString();
}

La documentation de la méthode native indique :

Les fichiers temporaires dont le nom a été créé par cette fonction ne sont pas automatiquement supprimés. Pour supprimer ces fichiers, appelez DeleteFile.

J'ai trouvé un excellent article intitulé "Ces fichus fichiers temporaires" qui commence par les bases et aborde certains problèmes moins évidents de la gestion des fichiers temporaires, comme.. :

  • Comment s'assurer que le fichier est supprimé (même si l'application se plante !) : FileOption.DeleteOnClose et laisser le noyau s'en occuper)
  • Comment obtenir la bonne politique de mise en cache pour le fichier, afin d'améliorer les performances (indice : FileAttributes.Temporary )
  • Comment s'assurer que le contenu du fichier reste sécurisé, car :
    • le nom du fichier est encore plus prévisible avec la méthode gérée qu'avec la méthode non gérée.
    • le fichier temporaire est créé, alors fermé Vous obtenez alors le chemin d'accès au fichier (pour ensuite l'ouvrir à nouveau), ce qui laisse une petite fenêtre d'opportunité à un code/utilisateur malveillant pour détourner le fichier.

L'article montre également une mise en œuvre en C#.

8voto

Marc Gravell Points 482669

D'après les fichiers de mars dans mon %tmp%, je dirais que non.

C'est pourquoi ils sont appelés temporaires - parce que c'est l'usage auquel ils sont destinés. Ce ne sont pas des fichiers système, ce ne sont pas des fichiers d'application, et ce ne sont pas des documents utilisateur... ils n'existent que pour permettre à une application de faire un traitement temporaire (peut-être sur de gros volumes de données), ou souvent pour passer des données via IPC à un autre processus. Ils sont donc vraiment temporaires.

Vous devriez chercher à supprimer tous les fichiers temporaires que vous créez, malgré les "kill" fatals, etc. J'utilise souvent "l'utilisation" pour cela - je crée une classe d'encapsulation - c'est-à-dire

sealed class TempFile : IDisposable { // formatted for space
    string path;
    public string Path {
        get {
            if(path==null) throw new ObjectDisposedException(GetType().Name);
            return path;
        }
    }
    public TempFile() : this(System.IO.Path.GetTempFileName()) { }

    public TempFile(string path) {
        if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path");
        this.path = path;
    }

    private void Dispose(bool disposing) {
        if (path != null) {
            try {
                File.Delete(path);
            } catch { } // best endeavours...
            path = null;
        }
    }
    public void Dispose() {
        GC.SuppressFinalize(this);
        Dispose(true);
    }
    ~TempFile() {
        Dispose(false);
    }
}

5voto

paul Points 4903

Il existe un FileOptions.DeleteOnClose qui pourrait faire ce que vous voulez.

Voici un lien vers le MSDN page.

1voto

Mihai Limbășan Points 17205

Non, ce n'est pas vrai. Fondamentalement, votre application est responsable du nettoyage de son propre désordre. Si vous ne le faites pas, les fichiers temporaires s'accumuleront au fil du temps.

0voto

Treb Points 11153

Non, il incombe au logiciel (lire : au développeur) qui crée un fichier temporaire de s'en débarrasser.

Jetez un coup d'œil dans votre propre dossier temporaire pour voir si cela fonctionne bien ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X