Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как удалить файл в С++ не используя remove(), из чистого Си 
:(
    Опции темы
magesi
  Дата 28.6.2012, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Как удалить файл в С++ , не используя ф-цию remove() из стандартной Сишной либы <stdio.h> ?
PM MAIL   Вверх
Dem_max
Дата 28.6.2012, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Код

#include <stdlib.h>

system("del file.txt");


Это сообщение отредактировал(а) Dem_max - 28.6.2012, 18:26


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
magesi
  Дата 28.6.2012, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Dem_max, ога  smile спс забыл про такое

а еще можно:

- специфичными OS ф-циями, аля DeleteFile() из WinAPI , или unlink из *nix
- посмотреть, как remove был сам имплементирован из stdio
- asm ( в целом, относится и к первым двум пунктам )


На АСМ так можно 
Код

pushl filename;
call remove;
addl $4 %esp


Хотя, это попса на АСМ, многие понимают, почему  smile 

PS
Dem_max, хотя знаешь... не, не покатит system() из stdlib , надо совсем без Сишных ф-ций

Кстати, под Win, если вы компилили программу MS компилером, то в любом случае remove() будет вызывать NtDeleteFile() из Native API в конце, что происходит используя GCC или др., не знаю  smile хотя наверное, тоже самое

Это сообщение отредактировал(а) magesi - 28.6.2012, 21:05
PM MAIL   Вверх
magesi
  Дата 28.6.2012, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



А вообще!  smile Если уж копать дальше, то:

Я могу продебагить remove() до системного вызова ( 0x2e или sysenter инструкции ) внутрях ntdll!NtDeleteFile()
Если посмотреть, kernel сущность NtDeleteFile() , надо бы раздобыть kernel debugger

Короче ntdll.dll!NtDeleteFile() вызывается при remove() на Винде после MS компилера в программе

Единственная часть уровеня АСМ ф-ции remove() - это всякие SYSCALL/SYSENTER инструкции, которые зависимы от ОС, и у каждой свои, но это конечно уже далеко, как от Си, так и от Си++

Но это я так по Винде немного покопался, в *nix unlink() копать надо будет  smile 

Для любитлей boost можно так выпендриться:
Код

boost::filesystem::remove() 


Правда, это вызывает в Boost либо тот же remove() из stdio , либо какой-нибудь SYSCALL/SYSENTER сразу без вызова ф-ции stdio или точно также имплементирована, как remove() с вызовом NtDeleteFile() сразу

Это сообщение отредактировал(а) magesi - 28.6.2012, 22:20
PM MAIL   Вверх
boostcoder
Дата 28.6.2012, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(magesi @  28.6.2012,  22:14 Найти цитируемый пост)
это вызывает в Boost либо тот же remove() из stdio

согласно сорцу, для венды используются WINAPI, для POSIX - remove()
PM WWW   Вверх
magesi
Дата 28.6.2012, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(boostcoder @ 28.6.2012,  22:32)
Цитата(magesi @  28.6.2012,  22:14 Найти цитируемый пост)
это вызывает в Boost либо тот же remove() из stdio

согласно сорцу, для венды используются WINAPI, для POSIX - remove()

POSIX, не POSIX все равно все к syscall сводится  smile который определенный на определенной системе, т.е. полная зависимость
а всякие POSIX/не-POSIX вызовы, это не более, чем формат/способ вызова определенного syscall на определенной OS и не более

Добавлено @ 22:50
Но вообще, если еще глубже копнуть, то это зависит от возможностей для работы, которые предоставляют в первую очередь железки, а потом уж разработчики ОС выбирают, что использовать. К примеру, они могут тот же syscall создать ( т.е. как его имплементируют ) испульзуя page faults.

Т.е. пишится параметры в специальную области памяти, и как из kernel перехватывает доступ к этому...  smile мдя... лепота, пойду за виски

Это сообщение отредактировал(а) magesi - 29.6.2012, 02:33
PM MAIL   Вверх
volatile
Дата 29.6.2012, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(magesi @  28.6.2012,  22:36 Найти цитируемый пост)
Но вообще, если еще глубже копнуть, то это зависит от возможностей для работы, которые предоставляют в первую очередь железки

Как я понял, вы задумали удалить файл, минуя операционку?
В таком случае, опускаться до уровня железок не нужно. Нужно до уровня форматов.
Примерная схема действий:

1. Выяснить формат. Возможных форматов вагон и целая тележка: FAT12, FAT16, FAT32, NTFS*, в никсах: ext2, ext3, ext4, XFS, JFS, ReiserFS и еще с десяток ) и это только самые распространенные.

2. Изучить этот формат (кстати информация есть далеко не по всем форматам, например мелкомягкие не публикуют офиц. инфу по NTFS.  Есть правда стороняя информация, но она добыта методом тыка и хака, а потому ненадежна, и возможно не поддерживает новые версии)

3. Получить права доступа к диску на низком уровне.

4.Затереть нужный байтик, в нужном секторе. (используя информацию добытую в 2 пункте)

smile 

PM MAIL   Вверх
magesi
  Дата 29.6.2012, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(volatile @  29.6.2012,  00:08 Найти цитируемый пост)
Как я понял, вы задумали удалить файл, минуя операционку?

минуя операционку из операционки  smile 

Цитата(volatile @  29.6.2012,  00:08 Найти цитируемый пост)
Как я понял, вы задумали удалить файл, минуя операционку?

в целом, уже "да" smile но изначально я искал способ удалить файл средствами Си++ не используя чисто сишные ф-ции, а в итоге пришел к этому smile

Это сообщение отредактировал(а) magesi - 29.6.2012, 02:35
PM MAIL   Вверх
500mhz
Дата 29.6.2012, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



Как то странно рассуждаете

имеем

прога на С   -->  libc --> системные либы -- > драйвера устройств -- > железо

Что бы удалить незаметно для ОС файлик нужно минуя всю эту цепочку "договорится" с железом
Для этого нужно всего то 3 пункта выполнить


1) Root
2) Знание FS на которой хотим удалить файлик
3) Свой драйверок для работы с HD


--------------------

PM MAIL ICQ   Вверх
Randajad
Дата 29.6.2012, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Если цель в том, чтобы OS не сообщила кому-нибудь, что файл - удален, то, по-моему, нужно заюзать драйвер FS и никому не говорить, что вы удалили файлик. Удаление через железо - плохая идея. Можно легко убить всю FS. А в таблицах FS OS, которые в памяти, файл в итоге может остаться.

Это сообщение отредактировал(а) Randajad - 29.6.2012, 12:47
PM MAIL   Вверх
magesi
Дата 29.6.2012, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(500mhz @  29.6.2012,  12:19 Найти цитируемый пост)
Как то странно рассуждаете

выделите конкретно место странности, иначе пустозвонтсво
PM MAIL   Вверх
feodorv
Дата 29.6.2012, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Гм. Можно взять соседний файл с этого же устройства (с нужными правами доступа), сделать ему move на наше имя, а потом обратное move, восстанавливая ему первоначальное имя...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1027 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.