2010-08-16 2 views

ответ

2

Вы можете открыть файл в режиме записи, а затем закройте его.

+0

как я получаю все файлы в каталоге в C – nis

3

На самом деле, вы действительно сделать не необходимости делать это в C. UNIX включает в себя инструменты, которые могут просто сделать о любой задачи, которую вы хотите.

find . -type f -exec cp /dev/null {} ';' 

Этот конкретный фрагмент кода выше будет найти все файлы в текущей директории и попытаться скопировать нулевое устройство к нему, эффективно усечения файл 0 байт.

Вы можете изменить начальный (верхний уровень) каталог, ограничить имена (например, -name '*.jpg') и даже ограничить его текущим каталогом (без подкаталогов) с помощью -maxdepth 0.

Есть много других вариантов с find, которые вы можете обнаружить, введя man find в вашу командной строке оболочку. Просто не ввести его в Google, вы можете получить больше, чем вы оговорен :-)


Если необходимость в использовании C является абсолютно необоротную один, я бы до сих пор сделать это таким образом но:

system ("find . -type f -exec cp /dev/null {} ';'"); 

Я не заинтересован в повторном написании программного обеспечения, что кто-то уже положило bucketload усилий на обеспечение свободного :-)


Если после мой совет, вы еще хотите сделать это трудным путем, вам нужно посмотреть opendir, readdir и closedir для обработки каталогов, а затем просто используйте fopen в режиме записи, за которым следует fclose для каждого файла-кандидата.

Если вы хотите перемещаться по целым структурам каталогов, а не только с текущим каталогом, вам придется обнаруживать каталоги от readdir и, вероятно, проходить через них.

+0

да, но мой код находится в c – nis

+0

Затем, серьезно, используйте 'system (" find. -type f -exec cp/dev/null {} ';' "); '. В редких случаях редко можно изобретать колесо. – paxdiablo

+0

вы также можете использовать 'truncate (filename, 0)' вместо открытия/закрытия файла – Hasturkun

3

В Bash:

for i in directory/*; do > $i; done 

Это сохранит право собственности и права доступа к файлу.

Не делайте раковины в C! Сохраните огромное количество времени, используя лучший инструмент для работы. Если это домашнее задание, отметьте его как таковое.

+2

Кстати, вам не нужно запускать эхо, 'do> $ i; done' работает так же, как и – Hasturkun

+0

thx, отредактировал ответ соответственно. – ypnos

3
  • scandir перечислить их, а затем для каждого файла:
  • fopen(, w+)
  • fstat, чтобы получить размер
  • fwrite весь файл с нулями? (Это то, что вы имеете в виду ясно?)
  • fclose

Хороший вариант оболочки будет: shred -z directory/*

+0

Просто 'scandir()', за которым следует 'truncate (filename, 0)' в каждом файле, сделает трюк. – caf

+0

Ну ... зависит, если вы хотите, чтобы это было сложно (er), чтобы восстановить, тогда написание данных на месте здраво. В противном случае да, просто 'truncate()' или более стандартное соответствие 'fopen (file," w ") + fclose()' будет делать трюк. – domen

+0

Это не повлияет на появление файловых систем с копированием на запись, хотя;) – caf

Смежные вопросы