Как удалить текстовый файл с
DirectoryInfo (продолжение)
В этом случае программа выдаст нам список всех файлов находящихся в определенном каталоге. В приведенном выше примере вывод консоли будет примерно следующим:
То есть, при использовании метода GetFiles() без параметров просматривается только конкретный каталог. У метода GetFiles() имеется ряд переопределенных версий, позволяющих организовать поиск вглубь для того, чтобы вывести список файлов, находящихся не только в конкретном каталоге, но и во всех поддиректориях. Например, просмотрим все файлы в каталоге C:\Program Files (x86)
Здесь мы воспользовались переопределенной версией метода GetFiles() у которого первый параметр представляет собой маску по которой будут искаться файлы (например, мы могли бы задать вот такую маску для поиска только текстовых файлов — « *.txt «), а второй параметр — настройки поиска (в нашем случае — это SearchOption.AllDirectories , что указывает на то, что поиск будет вестись по всех каталогам).
Класс FileInfo
Ниже представлены наиболее часто используемые свойства и методы работы с файлами посредством класса FileInfo :
- CopyTo(path) — копирует файл в новое место по указанному пути path
- Create() — создает файл
- Delete() — удаляет файл
- MoveTo(destFileName) — перемещает файл в новое место
- Свойство Directory — получает родительский каталог в виде объекта DirectoryInfo
- Свойство DirectoryName — получает полный путь к родительскому каталогу
- Свойство Exists — указывает, существует ли файл
- Свойство Length — получает размер файла в байтах
- Свойство Extension — получает расширение файла
- Свойство Name — получает имя файла
- Свойство FullName — получает полное имя файла
Для создания нового файла и записи в него данных можно воспользоваться методом Create() :
Или же, если мы точно знаем, что нам необходим текстовый файл, то воспользоваться методом CreateText() :
В отличие от Create() метод CreateText() возвращает нам объект типа StreamWriter , который предоставляет удобные методы и свойства для работы в том числе и со строками, поэтому во втором примере нам не понадобилось преобразовывать строку в массив байтов для записи в файл. В свою очередь, метод Create() удобно использовать для записи бинарных файлов.
Чтобы получить информацию о файле мы можем воспользоваться свойствами класса FileInfo , например, как показано ниже:
Перед тем, как перемещать файл в другой каталог необходимо обязательно проверить существование этого каталога на диске и, если каталог отсутствует, то создать его, иначе мы получим исключение.
Класс File
- Copy() — копирует файл в новое место
- Create() — создает файл
- Delete() — удаляет файл
- Move() — перемещает файл в новое место
- Exists(file) — определяет, существует ли файл
Подробно описывать работу каждого методы не будем, так как они реализуют ровно те же операции, что и в классе FileInfo .
Итого
Удаление файла *.txt через библиотекуЗдравствуйте! Хочу использовать временный файл,для сохранения в нем главной информации,если приложение неожиданно завершит работу. Возникли вопросы:
1)Как удалить файл,если путь для него указан в другой функции?
2)Как удалить содержимое файла при новой записи без переоткрывания (
)
То есть сохраняем шаг,если не вылетели,то удалили его,записали новый шаг.
Для удаления планирую использовать .clear(); ,но путь,по которому файл был записан, я не знаю,и поэтому нужно его как-то передать.
Если сделать область видимости глобальной для переменной ,в которой хранится путь до файла,то возрастет потребления памяти.
Может передать в качестве возвращаемого значения,но у меня переменная типа stringstream, не знаю как с ней работать.
Удаление строки из txt файла, через какое-то время
на хостинге есть txt файл в нём 5 строк id1 - серийник 1 id2 - серийник 2 id3 - серийник 3.
Чтение файла через fstream
прочитать из файла матрицу и записать в новый файл её минимальный элемент в первой строке задана.
Решение
1. передать каким либо образом путь к месту использования.
(хороший вариант)
2. заюзать особый телепатический компиляхтер.
который умеет подключаццо к астральному серверу.
астральный сервер напрямки подключаеццо прямо в моск пользователя,
и оттуда читает значение пути.
(фантастический вариант)
1. никак
(реальность)
2. попросить астральный сервер
(влажные мечты)
можно перемещать позицию чтения/записи файла
на энное количество байт от начала файла.
а значит, можно заюзать индексированный формат файла.
индексированный формат файла - это особый формат файла,
который позволяет легко и быстро определять области тех,
или иных данных внутри файла.
первая строка - заголовок. всегда фиксированного размера
первая цифра - количество записей.
дальше массив из длин записей.
в данном случае получаем: 3 записи по 255 байт каждая.
зная количество записей и их длину,
всегда можно вычислить место-расположение любой из них.
а значит, теперь записи всегда можно менять/добавлять/удалять.
при модификации строк,
мы просто учитываем изменения в заголовке файла.
Подобно паре Directory/DirectoryInfo для работы с файлами предназначена пара классов File и FileInfo . С их помощью мы можем создавать, удалять, перемещать файлы, получать их свойства и многое другое.
FileInfo
Некоторые полезные методы и свойства класса FileInfo :
CopyTo(path) : копирует файл в новое место по указанному пути path
Create() : создает файл
Delete() : удаляет файл
MoveTo(destFileName) : перемещает файл в новое место
Свойство Directory : получает родительский каталог в виде объекта DirectoryInfo
Свойство DirectoryName : получает полный путь к родительскому каталогу
Свойство Exists : указывает, существует ли файл
Свойство Length : получает размер файла
Свойство Extension : получает расширение файла
Свойство Name : получает имя файла
Свойство FullName : получает полное имя файла
Для создания объекта FileInfo применяется конструктор, который получает в качестве параметра путь к файлу:
Класс File реализует похожую функциональность с помощью статических методов:
Copy() : копирует файл в новое место
Create() : создает файл
Delete() : удаляет файл
Move : перемещает файл в новое место
Exists(file) : определяет, существует ли файл
Пути к файлам
Для работы с файлами можно применять как абсолютные, так и относительные пути:
Получение информации о файле
Удаление файла
Перемещение файла
Если файл по новому пути уже существует, то с помощью дополнительного параметра можно указать, надо ли перезаписать файл (при значении true файл перезаписывается)
Копирование файла
Метод CopyTo класса FileInfo принимает два параметра: путь, по которому файл будет копироваться, и булевое значение, которое указывает, надо ли при копировании перезаписывать файл (если true , как в случае выше, файл при копировании перезаписывается). Если же в качестве последнего параметра передать значение false , то если такой файл уже существует, приложение выдаст ошибку.
Метод Copy класса File принимает три параметра: путь к исходному файлу, путь, по которому файл будет копироваться, и булевое значение, указывающее, будет ли файл перезаписываться.
Чтение и запись файлов
В дополнение к вышерассмотренным методам класс File также предоставляет ряд методов для чтения-записи текстовых и бинарных файлов:
AppendAllLines(String, IEnumerable) / AppendAllLinesAsync(String, IEnumerable, CancellationToken)
добавляют в файл набор строк. Если файл не существует, то он создается
AppendAllText(String, String) / AppendAllTextAsync(String, String, CancellationToken)
добавляют в файл строку. Если файл не существует, то он создается
byte[] ReadAllBytes (string path) / Task
считывают содержимое бинарного файла в массив байтов
string[] ReadAllLines (string path) / Task
считывают содержимое текстового файла в массив строк
string ReadAllText (string path) / Task ReadAllTextAsync (string path, CancellationToken cancellationToken)
считывают содержимое текстового файла в строку
IEnumerable ReadLines (string path)
считывают содержимое текстового файла в коллекцию строк
void WriteAllBytes (string path, byte[] bytes) / Task WriteAllBytesAsync (string path, byte[] bytes, CancellationToken cancellationToken)
записывают массив байт в бинарный файл. Если файл не существует, он создается. Если существует, то перезаписывается
void WriteAllLines (string path, string[] contents) / Task WriteAllLinesAsync (string path, IEnumerable contents, CancellationToken cancellationToken)
записывают массив строк в текстовый файл. Если файл не существует, он создается. Если существует, то перезаписывается
WriteAllText (string path, string? contents) / Task WriteAllTextAsync (string path, string? contents, CancellationToken cancellationToken)
записывают строку в текстовый файл. Если файл не существует, он создается. Если существует, то перезаписывается
Как видно, эти методы покрывают практически все основные сценарии - чтение и запись текстовых и бинарных файлов. Причем в зависимости от задачи можно применять как синхронные методы, так и их асинхронные аналоги.
Например, запишем и считаем обратно в строку текстовый файл:
Стоит отметить, что при добавлении текста я добавил в строку последовательность "\n", которая выполняет перевод на следующую строку. Благодаря этому добавляемый текст располагается в файле на новой строке.
Если мы хотим, что в файле изначально шло добавление на новую строку, то для записи стоит использовать метод WriteAllLines/ WriteAllLinesAsync , а для добавления - AppendAllLines / AppendAllLinesAsync
Аналогично при чтении файла если мы хотим каждую строку файла считать отдельно, то вместо ReadAllText / ReadAllTextAsync применяется ReadAllLines / ReadAllTextAsync .
Кодировка
В качестве дополнительного параметра методы чтения-записи текстовых файлов позволяют установить кодировку в виде объекта System.Text.Encoding :
Для установки кодировки при записи и чтении здесь применяется встроенное значение Encoding.Unicode . Также можно указать название кодировки, единственное следует удостовериться, что текущая операционная система поддерживает выбранную кодировку:
подскажите как очистить текстовый файл.
fstream file
то есть сделать чтоб он был пустым?
подскажите как удалить файл?
всем заранее спасибо!
Есть кнопка "Редактировать"
Еще один такой же, кнопку "Редактировать юзайте"
FILE * fopen( "fname", "w" )
Существующий файл с указанным именем будет стерт, а вместо него будет открыт новый файл (с тем же именем). Если файла с указанным вами именем не существует, он будет создан.
P.S. Позволю себе дать вам дружеский совет: если я не ошибаюсь, вы начали изучение сразу с C++. Не пожалейте месяца изучите хотя бы базовый курс простого Си. Убежден, не пожалеете!
С наилучшими пожеланиями.
[QUOTE=Adamant;51607]
FILE * fopen( "fname", "w" )
Существующий файл с указанным именем будет стерт, а вместо него будет открыт новый файл (с тем же именем). Если файла с указанным вами именем не сущес. QUOTE]
У меня Билдер пишет хрень какуюто: "can not convert char * to file *",
причем тут чар? Не знаете что за ошибка?
FILE *fp;
if( ( fp = fopen( "C:/Papka/file.txt", "w" ) ) == NULL )
puts( " Чего-то я не могу ваш файл открыть?!" );
getch();
exit();
>
fclose( fp );
puts( "А файл то уже пустой! ");
FILE * fopen( "fname", "w" )
P.S. Позволю себе дать вам дружеский совет: если я не ошибаюсь, вы начали изучение сразу с C++. Не пожалейте месяца изучите хотя бы базовый курс простого Си.
Некоторые считают что Си может помешать правильному восприятию Си++ изначально так сказаать збитть с толку, хотя я не согласен. в принципе fstream может делать все что и FILE так что
Некоторые считают что Си может помешать правильному восприятию Си++ изначально так сказать сбить с толку, хотя я не согласен.
В этом есть рациональное зерно: все таки разное мышление. В Си - структурное, а в Си с плюсами все таки преимущественно объектно-ориентированное. Но на мой взгляд знание "простых Сей" лишним ни в коем случае не будет. Лично из моего опыта по самостоятельному изучения: ( если это кому-нибудь будет интересно). Начал изучать сразу с Сей с плюсами, как мне тоже посоветовали, но через месяц бросил (многое не мог понять), начал с Си (правда уже была база знаний в PHP), после этого у меня все пошло как по маслу, правда действительно иногда давало о себе знать структурное мышление, но оно со временем перестает доминировать). Еще раз подчеркиваю, это сугубо мое мнение, которое может не совпадать с вашим.
С уважением.
Может немного не по теме, но если использовать namespase std, и обьявлять переменную тима ifstream, то после того как мы доходим до конца файла (-1 позиция) фаил становиться аьсолютно не доступен, т.е. его нельзя не закрыть функция close.filename и похицию поменять тоже нельзя seekg.filename пока я с правляюсь с этой проблемой просто записывая всё содержимое файла в стринговую переменную, но хотелось бы услышать возможность РЕШЕНИЯ проблемы а не её ОБХОЖДЕНИЯ как в моём случае
filename.clear(); // стереть флаг ошибки
По востижении EOF ios::state устонавливается в badbit, для дальнейшей работы надо badbit обнулить делает это функция член ios::clear();
Появилась надобность написать метод, который по указанному пути будет удалять из директории один файл. Ниже приведены варианты. Не могу решить, какой из них наиболее подходящий с точки зрения читаемости и производительности.
На скриншоте ниже показано среднее время выполнения каждого метода. Как можно заметить - последние два имеют наименьший результат.
Нужен совет. Какой из данных методов предпочтительнее использовать?
Первый метод - удаление всего в директории, все остальные делают все тоже самое, разница только в том, что где то вы сгруппировали различные методы в одну "портянку", а где то наоборот, разбили все по своим переменным. Тут вы экономите совершенно не на том. Что касается самого задания, то на кой черт вам перебор не пойму, если файл 1? Вызывайте просто File.Delete("C:\\MyFile.txt"); и будет вам счастье.
@EvgeniyZ И я плюсану, пишите. Ответ полностью на все поставленные вопросы дан: экономия на спичках, разницы толком нет, удаляется разное, непонятно зачем цикл.
1 ответ 1
Давайте разберем ваши методы:
Первый метод - Здесь вы при вызове задаете ему некий путь к директории, потом получаете всю информацию о ней (и о каждом файле) и затем уже в цикле пробегаете по всем файлам в данной директории, удаляя каждый. По сути вам не нужно знать всю информацию о директории, а значит можно от DirectoryInfo отказаться и использовать просто пути до файлов, метод в итоге будет такой:
Другие методы - Вы также при вызове задаете некий путь, получаете всю информацию о данной директории и после этого удаляете первый файл в данной директории. Все методы у вас одинаковы, разница только в том, что во втором методе вы вынесли отдельно в переменную di информацию о текущей директории; в третьем методе вы еще дополнительно вынесли информацию о файле в переменную _file ; ну а в четвертом вы вовсе все написали сплошной "портянкой". Я вам больше даже скажу, все эти методы у вас имеют серьезную ошибку (попробуйте указать путь к пустой директории).
Читаемость кода - Тут тоже, у каждого свое представление, свой стиль, я к примеру люблю минимализм, если это хорошо читается и возможно разместить в одну строку, то почему бы и нет. Пример переписанного первого метода в одну строку, (как с читаемостью?):
Правильное решение - Вы пишите:
написать метод, который по указанному пути будет удалять из директории один файл.
Так может вам проще сразу удалить файл по пути? Вызовите всего один метод File.Delete(file); , в который передаете путь до нужного файла, не нужно циклов, не нужно получать полную информацию. Если не известно имя файла, то получайте просто путь первого файла в директории (пример var file = Directory.GetFiles(path).FirstOrDefault(); ), этого будет вполне достаточно.
Читайте также: