Что произойдет, если я запишу файл с помощью StreamWriter на полный жесткий диск?

Я пишу много файлов .csv на свой жесткий диск, чтобы регистрировать некоторые данные измерений, используя StreamWriter и CsvHelper из класса Джоша Клоуза:

using (TextWriter writer = new StreamWriter(path,true))
using (CsvWriter = new CsvWriter(writer))
{
    writer.WriteLine("1...");
    /// ...
    /// ...
    /// ...
    writer.Flush();
}

За ночь на них может храниться до 500 МБ данных. Итак, сегодня меня беспокоит этот вопрос: что произойдет, если на моем жестком диске или USB-накопителе больше не будет свободного места, и я захочу записать новый файл? И как лучше всего предотвратить эту ситуацию? Это вызовет исключение или нет? Я ничего не нашел в документах .NET об этой ситуации.


person Sebastian Richter    schedule 16.10.2015    source источник
comment
Это вызовет исключение, и ваши ответы будут ограничены покупкой USB-накопителя большего размера или записью меньшего количества данных.   -  person DavidG    schedule 16.10.2015
comment
Просто заархивируйте данные, если они вам не нужны, или просто используйте метод сжатия для сохранения из пространства.   -  person Hozikimaru    schedule 16.10.2015
comment
Вы не можете сделать так, чтобы место на диске появилось только потому, что оно вам нужно. Если диск заполнен, вы не можете больше писать.   -  person Ron Beyer    schedule 16.10.2015
comment
@DavidG Хорошо, спасибо, а какое исключение? У вас есть ссылка для меня?   -  person Sebastian Richter    schedule 16.10.2015
comment
@RonBeyer О, правда... Капитан. Очевидный?   -  person Sebastian Richter    schedule 16.10.2015


Ответы (2)


Он выдаст новый IOException. Вы можете проверить, является ли исключение заполненным диском (проверка заполнения диска взята из здесь)

try
{
    //Write stuff to disk
}
catch(IOException ex)
{
    if(IsDiskFull(ex))
    {
        //Disk is full
    }
}


public static bool IsDiskFull(Exception ex)
{
    const int ERROR_HANDLE_DISK_FULL = 0x27;
    const int ERROR_DISK_FULL = 0x70;

    int win32ErrorCode = Marshal.GetHRForException(ex) & 0xFFFF;
    return win32ErrorCode == ERROR_HANDLE_DISK_FULL || win32ErrorCode == ERROR_DISK_FULL;
}
person DavidG    schedule 16.10.2015
comment
Я тоже собирался дать ссылку на этот ответ :) - person user1666620; 16.10.2015
comment
@SebastianRichter Тогда это помогло? - person DavidG; 16.10.2015
comment
@DavidG да, это мне поможет! Я ничего не нашел на свой вопрос. Может быть, я гуглил неправильные ключевые слова. Также я не знаю, почему за мой вопрос проголосовали? Для меня это была важная проблема. - person Sebastian Richter; 16.10.2015
comment
Это может быть из-за вашего комментария о том, что вы не принимаете покупку USB-накопителя большего размера. Во всяком случае, я удалил это и привел в порядок вопрос. Я сейчас поставлю вам плюс :) - person DavidG; 16.10.2015
comment
@DavidG Спасибо. Может быть, я должен позволить шутки, в следующий раз :). - person Sebastian Richter; 16.10.2015

Вы должны хранить отдельные прокручивающиеся файлы, старые файлы которых можно удалить, когда ваш жесткий диск заполнится (никогда не ждите, пока это произойдет!).

Сравните оставшееся место на диске с данными, которые вам нужно записать, и выполните удаление до того, как у вас действительно закончится место.

person fabrosell    schedule 16.10.2015