С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020

DeleteFile Ошибка доступа

12.07.2015, 14:01. Показов 3249. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Я использую вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (SetFileAttributes(strFilePath.c_str(), FILE_ATTRIBUTE_NORMAL) == FALSE)
                    {wcout << GetLastErrorAsString().c_str()  << endl;
                        return ::GetLastError();}
                    
 
                    // Delete file
                    if (DeleteFile(strFilePath.c_str()) == FALSE) // удаление файла
                    {
                        cout << "mark: "<< endl;
                        std::wstring ws = GetLastErrorAsString();
                        std::string s(ws.begin(), ws.end());
                        cout << s<< endl;
                        wcout << ws.c_str() << endl;
                        return ::GetLastError();
                    }
                    else 
                        cout<<"File deleted"<<endl;
                }
чтобы удалить файл, атрибут выставляется без ошибки; но при попытке удалить файл появляется: "Ошибка доступа".
Нагромождения со строками - результаты попытки вывести ошибку на экран, но wcout почему то выводит пустую строку.
При запуске из-под администратора файлы тоже не удаляются.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.07.2015, 14:01
Ответы с готовыми решениями:

DeleteFile
Есть директория N в ней лежит программа, в этой папке есть след пусть N\Projects\MyProjects В MyProjects лежит файл test.text Как мне...

Функция DeleteFile
Здравствуйте, господа. Не получается разобраться с функцией DeleteFile, а именно: стоит задача удалить все копии файлов из выбранной...

Ошибка прав доступа
Не могу выполнить программу пишет ошибка прав доступа. #include &quot;windows.h&quot; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int...

18
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
12.07.2015, 22:32
Вообще никакие не удаляются? Если создать в Блокноте, например, файл и попытаться удалить?
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
13.07.2015, 10:01  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Вообще никакие не удаляются? Если создать в Блокноте, например, файл и попытаться удалить?
У меня папка с содержимым из нескольких txt, одного rar и одного jnt + вложенная папка. FindNextFile сначала находит два файла "." и ".." (что это? ), потом при проходе по всем остальным в этой папке "Отказано в доступе."
Файлы создавал сам, никакие приложения их не используют.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.07.2015, 11:03
"." и ".." - это наследие DOS, ссылка на текущий каталог и на каталог ниже, просто игнорируй.
Проводником файлы удаляются?
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
13.07.2015, 12:51  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Проводником файлы удаляются?
Удаляются.
Цитата Сообщение от nmcf Посмотреть сообщение
"." и ".." - это наследие DOS, ссылка на текущий каталог и на каталог ниже,
Что за ссылка? Ярлык?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.07.2015, 19:01
Может, на счёт DOS я не совсем верно сказал, наверное, это из Unix пошло изначально.
"." - это ссылка на себя для каталога, а ".." - на родительский каталог в самой файловой системе. Это не ярлыки, а каталоги такие специальные. Ну как в Far сверху всегда есть две точки, нажимаешь и переходишь на уровень выше.

Код ошибки ERROR_ACCESS_DENIED?
1
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
14.07.2015, 05:07
может тут лучше пример:
D:\test_dir\..\file.txt - это D:\file.txt

D:\test_dir\.\file.txt - это D:\test_dir\file.txt

C++
1
DeleteFile("d:\\test_file.txt"); //этот код проходит на ура
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
14.07.2015, 09:08  [ТС]
Цитата Сообщение от _Dimon_ Посмотреть сообщение
может тут лучше пример:
D:\test_dir\..\file.txt - это D:\file.txt
D:\test_dir\.\file.txt - это D:\test_dir\file.txt
Цитата Сообщение от nmcf Посмотреть сообщение
Может, на счёт DOS я не совсем верно сказал, наверное, это из Unix пошло изначально.
"." - это ссылка на себя для каталога, а ".." - на родительский каталог в самой файловой системе. Это не ярлыки, а каталоги такие специальные. Ну как в Far сверху всегда есть две точки, нажимаешь и переходишь на уровень выше.
В памяти они как что храняться?

Добавлено через 2 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
Код ошибки ERROR_ACCESS_DENIED?
Да.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
14.07.2015, 13:08
Цитата Сообщение от VoltDeMar Посмотреть сообщение
В памяти они как что храняться?
В FAT16, насколько я помню, это были именно каталоги, хранились также как все прочие в структурах файловой системы, но были не самостоятельными, а указывали, как написано выше.
Тебе их нужно просто отфильтровывать и всё.
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
14.07.2015, 13:23
А приведите несколько примеров пути удаления файла, именно из переменой (то есть конкретный случай по какому пути не удаляется)
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
15.07.2015, 08:56  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
А приведите несколько примеров пути удаления файла, именно из переменой (то есть конкретный случай по какому пути не удаляется)
C:\\SourceDirectory\\
При том что системный диск у меня D:
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
15.07.2015, 10:22
Я могу ошибаться, но проблема скоре всего в том,что во время удаления файл занят, вы его занимаете своей программой или же что то стороне его занимает.....Сделайте опыт,без чтения атрибута,просто программно удалите файл, если прокатит то надо переписать момент с чтением атрибута
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
15.07.2015, 11:59  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
Я могу ошибаться, но проблема скоре всего в том,что во время удаления файл занят, вы его занимаете своей программой или же что то стороне его занимает.....Сделайте опыт,без чтения атрибута,просто программно удалите файл, если прокатит то надо переписать момент с чтением атрибута
Помимо удаления, к этой папке ещё обращается функция составления списка :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
std::vector<std::wstring> CreateFileList(std::wstring const & path, std::vector<std::wstring> & Directories)
{   
    _TypeMessage t(LogMessageCounter, 1, 999, "Directory", "Создан список файлов "  );            
    WriteLog(t);
    std::vector<std::wstring> Files; 
    Directories.emplace_back(path);  
    std::wstring const searchMask = path + L"\\*.*";
    std::wcout << searchMask << std::endl;    
    WIN32_FIND_DATA FindFileData; 
    HANDLE hf = FindFirstFile(searchMask.c_str(), &FindFileData);
    if (hf != INVALID_HANDLE_VALUE)
    { do
        {  if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
            {  OutputDebugStringW(  FindFileData.cFileName  );
               OutputDebugStringW( L"\n");
                Directories.emplace_back(path + L"\\" + FindFileData.cFileName);     }
            else
            {  OutputDebugStringW(  FindFileData.cFileName  );
               OutputDebugStringW( L"\n");
                Files.emplace_back(path + L"\\" + FindFileData.cFileName);   }  } 
        while (FindNextFile(hf, &FindFileData) != NULL); 
    }
    else
    {  std::wcout << L"Invalid_handle_val" << std::endl;
       std::wcout << L"What to do?" << std::endl;   }
    
    if(CloseHandle(hf)) //добавил эту строку
    return Files;
добавил сюда CloseHandle, и она выдает ошибку.
Миниатюры
DeleteFile Ошибка доступа  
0
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
15.07.2015, 12:00  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
Сделайте опыт,без чтения атрибута,просто программно удалите файл,
Это не помогло.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
15.07.2015, 12:39
то есть если просто сделать "DeleteFile("Путь к файлу");" дает ошибку, верно?
0
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
15.07.2015, 14:08  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
то есть если просто сделать "DeleteFile("Путь к файлу");" дает ошибку, верно?
Да. Ошибка отказано в доступе. Только сейчас заметил что на диске C: при правом клике можно создать только папку, файлы создавать нельзя, о чем это говорит? Но и при создании директори на другом диске, где такого ограничения нет -все равно "Отказано в доступе."
Миниатюры
DeleteFile Ошибка доступа  
0
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
15.07.2015, 14:11  [ТС]
Решил так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int DeleteDirectory( std::wstring& refcstrRootDirectory)
{   try 
     {
         TCHAR *var = new TCHAR[refcstrRootDirectory.length() + 2];
         _tcscpy(var, refcstrRootDirectory.c_str());
         var[refcstrRootDirectory.length() + 1] = _T('\0');
 
        SHFILEOPSTRUCT shfo={0};
        shfo.wFunc=FO_DELETE;
        shfo.pFrom = var;
        shfo.fFlags=FOF_NOCONFIRMATION;
        shfo.fAnyOperationsAborted=false;
        shfo.hNameMappings=NULL;
        shfo.lpszProgressTitle=NULL;
 
        return SHFileOperation(&shfo);
     }
    catch(...)
    {
        OutputDebugStringW(GetLastErrorAsString().c_str());
                        OutputDebugStringW( L"\n");
                        return 0;
    }
}
Тему не закрываю, если подскажете в чем соль с правами буду благодарен.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
15.07.2015, 14:36
Лучший ответ Сообщение было отмечено VoltDeMar как решение

Решение

на диске С не дает создавать папки система безопасности ОС, она отключается в панели управления.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.07.2015, 09:29
Цитата Сообщение от Dinkin Посмотреть сообщение
на диске С не дает создавать папки система безопасности ОС, она отключается в панели управления.
Файлы создавать не даёт, папки создаются. Не нужно там ничего отключать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2015, 09:29
Помогаю со студенческими работами здесь

Ошибка доступа при выводе в listbox символа из файла
почему это произошло и как это можно починить? #include &quot;windows.h&quot; #include &quot;resource.h&quot; #define IDB_BUTTONF1 102 #define...

DeleteFile и try.catch
Удаляю файл через DeleteFile.Могут быть 2 ошибки:не существует и открыт. Как прикрутить сюда try - catch именно при ошибке удаления,если...

DeleteFile() или DeleteFileUTF8()?
Да, опять вопрос, набивший всем оскомину. Но в FPC-3.0 вроде бы при работе с файлами не надо больше использовать ф-ции с приставко UTF8....

DeleteFile, CopyFile, MoveFile
Как удалить файл с помощью delphi. (А также копировать, вставить и т.д.)

FILE *F, ShellExecute, DeleteFile
FILE *F; if ((F = fopen(&quot;read.txt&quot;, &quot;wt&quot;)) == NULL) { ShowMessage(&quot;..............&quot;); return; } AnsiString path = &quot;1.exe&quot;; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru