Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2018, 07:25   #1
Kuzma's_Mother
Пользователь
 
Регистрация: 12.12.2017
Сообщений: 11
Вопрос Почему так происходит? Какая-то мистика

Всем доброго времени суток.

У меня написана программа, что-то типа безопасного удалителя файлов.
Это происходит за 2 шага: перезапись содержимого файла случайной гаммой, а затем удаление. Алгоритм реализован на c#.

Проблема в том, что когда программа выполняется по шагам в режиме отладки - все корректно работает: файл перезаписывается гаммой, а затем удаляется, при восстановлении удаленного файла например программой Recuva, восстановленный файл будет набит этой случайной гаммой, что есть гуд.
А точнее - если после перезаписи гаммой сделать точку остановки в отладке, и затем выполнить команду удаления - то так же все будет хорошо.
НО. Как только программа отработала самостоятельно, вне отладки, то при восстановлении удаленного файла - случайной гаммы в нем НЕТ, он заполнен исходными данными.

Объясните пожалуйста, в чем проблема и почему так происходит
Kuzma's_Mother вне форума Ответить с цитированием
Старый 07.08.2018, 07:45   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код надо смотреть. Дебаг и релиз версии различаются.
p51x вне форума Ответить с цитированием
Старый 07.08.2018, 08:59   #3
Kuzma's_Mother
Пользователь
 
Регистрация: 12.12.2017
Сообщений: 11
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код надо смотреть. Дебаг и релиз версии различаются.
Я компилирую дебаг версию, ее и запускаю. Релиз не трогаю.
Kuzma's_Mother вне форума Ответить с цитированием
Старый 07.08.2018, 09:05   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Ну значит гадаем дальше на кофейной гуще - права на файл. Например, студия от админа запущена. Или вы используете какую либо функцию, которая требует повышения прав.
p51x вне форума Ответить с цитированием
Старый 07.08.2018, 10:15   #5
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Вы закрываете файл после записи?
Black Fregat вне форума Ответить с цитированием
Старый 08.08.2018, 07:49   #6
Kuzma's_Mother
Пользователь
 
Регистрация: 12.12.2017
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Вы закрываете файл после записи?
Да, конечно. (еслиб не закрывал, то и при отладке файл бы не перезаписывался)

Выяснились ОЧЕНЬ интересные подробности: если поставить программу на паузу перед удалением (System.Threading.Thread.Sleep(5000 ), то все работает отлично. Видимо и при отладке все хорошо, потому что программа тоже ставится на паузу как бы.

Сам код:
Код:
            int bytesread;
            byte[] buf = new byte[BUF_SIZE];
            var rng = new RNGCryptoServiceProvider();

//собственно перезапись
            for (int i = 0; i < Patterns.Length; ++i)
            {
                s.Position = 0;
                switch (Patterns[i])
                {
                    case 0x00:
                        byte[] temp = new byte[BUF_SIZE];
                        for (int j = 0; j < BUF_SIZE; ++j)
                        { temp[j] = 0x00; }
                        for (; ; )
                        {
                            bytesread = s.Read(buf, 0, BUF_SIZE);
                            if (bytesread == 0) break;
                            buf = temp;
                            s.Position -= bytesread;
                            s.Write(buf, 0, bytesread);
                            
                        }
                        break;
                    case 0x01:
                        temp = new byte[BUF_SIZE];
                        for (int j = 0; j < BUF_SIZE; ++j)
                        { temp[j] = 0xFF; }

                        for (; ; )
                        {
                            bytesread = s.Read(buf, 0, BUF_SIZE);
                            if (bytesread == 0) break;
                            buf = temp;
                            s.Position -= bytesread;
                            s.Write(buf, 0, bytesread);
                        }
                        break;
                    case 0x02:
                        for (; ; )
                        {
                            bytesread = s.Read(buf, 0, BUF_SIZE);
                            if (bytesread == 0) break;
                            //  rng.GetBytes(buf, 0, bytesread);
                            rng.GetBytes(buf);
                            s.Position -= bytesread;
                            s.Write(buf, 0, bytesread);
                        }
                        break;
                }
            }
        
            s.Close();

//блок переименования файла
            string newfilename;
            Random rnd = new Random(); Random rndc = new Random();
            int rand= rnd.Next(100000000, 999999999); int randc = rndc.Next(0x0041, 0x005A);
            newfilename = Path.Combine(MyFileInfo.DirectoryName, String.Concat("~",(char) randc, rand.ToString(),".tmp"));
            File.Move(MyFileInfo.FullName, newfilename);

//удаление файла 
           // System.Threading.Thread.Sleep(5000); - пауза, когда не закоментирована все работает
            File.Delete(newfilename);

Последний раз редактировалось Kuzma's_Mother; 08.08.2018 в 07:52.
Kuzma's_Mother вне форума Ответить с цитированием
Старый 08.08.2018, 07:53   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Надо полагать в буфере обновилось, файл удалился, а буфер не успевает записать. По идее так не должно быть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.08.2018, 07:58   #8
Kuzma's_Mother
Пользователь
 
Регистрация: 12.12.2017
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Надо полагать в буфере обновилось, файл удалился, а буфер не успевает записать. По идее так не должно быть
Есть мысли как исправить? Ставить на паузу на 5 секунд - это как то не очень эффективно)
Kuzma's_Mother вне форума Ответить с цитированием
Старый 08.08.2018, 08:06   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

FlushFileBuffers ?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.08.2018, 09:26   #10
Kuzma's_Mother
Пользователь
 
Регистрация: 12.12.2017
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
FlushFileBuffers ?
Добавление
Код:
s.Flush();
перед закрытием потока
Код:
s.Close();
результата не дало
Kuzma's_Mother вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто разъяснит почему так происходит с функцией JS DimaDR JavaScript, Ajax 4 15.11.2017 18:17
Мистика какая то, срочно прошу помощи знающих websaco Visual C++ 0 28.04.2014 16:44
Цикл Cardinal - почему так происходит? Nester Общие вопросы Delphi 2 28.07.2010 15:04
Form Region-почему так происходит Nester Общие вопросы Delphi 3 14.09.2009 21:16
Почему так происходит? Zeraim Общие вопросы Delphi 1 05.05.2008 14:10