Как я автоматически удаляю tempfiles в c#?

var dict = File.ReadLines("test.txt")
               .Where(line => !string.IsNullOrWhitespace(line))
               .Select(line => line.Split(new char[] { '=' }, 2, 0))
               .ToDictionary(parts => parts[0], parts => parts[1]);


or 

    enter code here

line="to=xxx@gmail.com=yyy@yahoo.co.in";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in
54
задан Kev 30 December 2008 в 13:48
поделиться

5 ответов

Ничто не гарантируется, если процесс будет уничтожен преждевременно, однако, я использую" using", чтобы сделать это..

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

    public TempFile(string path)
    {
        if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path");
        this.path = path;
    }
    public string Path
    {
        get
        {
            if (path == null) throw new ObjectDisposedException(GetType().Name);
            return path;
        }
    }
    ~TempFile() { Dispose(false); }
    public void Dispose() { Dispose(true); }
    private void Dispose(bool disposing)
    {
        if (disposing)
        {
            GC.SuppressFinalize(this);                
        }
        if (path != null)
        {
            try { File.Delete(path); }
            catch { } // best effort
            path = null;
        }
    }
}
static class Program
{
    static void Main()
    {
        string path;
        using (var tmp = new TempFile())
        {
            path = tmp.Path;
            Console.WriteLine(File.Exists(path));
        }
        Console.WriteLine(File.Exists(path));
    }
}

Теперь, когда эти TempFile расположен или собрал "мусор", файл удален (если возможный). Вы могли, очевидно, использовать это, как плотно ограниченный по объему как Вам угодно или в наборе где-нибудь.

74
ответ дан Marc Gravell 7 November 2019 в 17:40
поделиться

Вы могли P/Invoke CreateFile и передавать эти FILE_FLAG_DELETE_ON_CLOSE флаг. Это говорит Windows удалять файл, как только все дескрипторы закрываются. См. также: Win32 CreateFile документы .

18
ответ дан David Grant 7 November 2019 в 17:40
поделиться

Я не, прежде всего, программист C#, но в C++ я использовал бы RAII для этого. Существуют [приблизительно 111] подсказки при использовании подобного RAII поведения в C# онлайн, но большинство, кажется, использует финализатор — который не детерминирован.

я думаю, что существуют некоторые функции Windows SDK для создания временных файлов, но не знают, удалены ли они автоматически на завершении программы. Существует функция GetTempPath, но файлы там только удалены, когда Вы выходите из системы или перезапускаете, IIRC.

P.S. в документации деструктора C# говорится, что Вы можете и должны высвободить средства там, которые я нахожу немного нечетными. Если так, Вы могли просто удалить tempfile в деструкторе, но снова, это не могло бы быть абсолютно детерминировано.

3
ответ дан csl 7 November 2019 в 17:40
поделиться

Вы могли запустить поток на запуске, который удалит файлы, которые существуют, когда они "не были должны" для восстановления с катастрофического отказа.

0
ответ дан Austin Salonen 7 November 2019 в 17:40
поделиться

Его хорошее, чтобы видеть, что Вы хотите быть ответственными, но если бы файлы не огромны (> 50 МБ) Вы соответствовали бы всем (включенный MS) в отъезде их во временном каталоге. Дисковое пространство в изобилии.

Как csl отправленный, GetTempPath является способом пойти. Пользователи, которые коротки на пространстве, будут в состоянии выполнить очистку диска, и Ваши файлы (наряду со всеми else's) будут очищены.

3
ответ дан StingyJack 7 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: