YAVAY
@YAVAY
Я пожилая креветка

Как удалить файл с помощью функции DeleteFile() в C++?

Задача: удалить из каталога все файлы в названии которых есть символ "~" и размер которых 0.
Сделал поиск файлов по каталогу, но удаление почему-то не работает, выдаёт ошибку. Перепробовал много способов с разных форумов и т.д., но либо происходит ошибка компиляции, либо удаления всё же не происходит.
Пожалуйста, подскажите в чём ошибка и как исправить?

setlocale(LC_ALL, "");

	WIN32_FIND_DATA MyFile;
	HANDLE hFind;
	
	hFind = FindFirstFile(L"D:\\TestFolder\\*~*.txt", &MyFile);
	
	// проверка найден ли файл
	if (INVALID_HANDLE_VALUE != hFind) 
	{
		do // основная часть алгоритма
		{
			//         название_файла	  |			 размер			  |		удалить/оставить
			wcout << MyFile.cFileName << "|" << MyFile.nFileSizeLow<<"|";

			// проверка файла на удаление
			if (MyFile.nFileSizeLow == 0)
			{
				cout << "Этот удалить" << endl;

				if (DeleteFile(MyFile.cFileName) != 0) { // удаление 
					cout << "Deleting Access!" << endl; // вывод сообщения успешном удалении
				}
				else { // вывод сообщения об ошибке удаления
					cout << "Deleting Failed => " << GetLastError() << endl;
				}

			}
			else
			{
				cout << "Этот оставить" << endl;
			}

			cout << endl << endl;


		} while (NULL != FindNextFile(hFind, &MyFile));

	}
	else
	{
		cout << "\n\nФайлы удовлетваряющие условию не найдены!\n\n";
	}

	FindClose(hFind);


5d735bd688a20057461674.png
  • Вопрос задан
  • 2803 просмотра
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
Я сто лет не писал на плюсах, но даже мне очевидно, что файла нет, т.к. ищите файлы вы по абсолютному пути, а удаляете только по имени и в текущем каталоге таких файлов нет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
myjcom
@myjcom Куратор тега C++
Задача: удалить из каталога все файлы в названии которых есть символ "~" и размер которых 0.

А так?
#include<iostream>
#include<string>
#include<filesystem>
#include<vector>

// #include<windows.h> // DeleteFile ...

using namespace std;
using namespace experimental::filesystem;

auto pred = [](const auto& entry)
{
  return !is_directory(entry.path()) &&
         entry.path().filename().string().find("~") != string::npos &&
         file_size(entry.path()) == 0;
};

auto getFiles_if(const string& dir, decltype(pred) p)
{
  vector<directory_entry> result;

  if(!exists(dir))
  {
    cerr << "error: " << dir << "does not exist!";
    return result;
  }
  copy_if(directory_iterator(dir), {}, back_inserter(result), p);

  if(result.empty())
  {
    cout << "files not found\n";
  }

  return result;
}

int main()
{
  string dir = "D:\\temp";

  for(const auto& pf : getFiles_if(dir, pred))
  {
    string file = pf.path().string();
    cout << "delete file? " << file << " (y/n): ";
    if(char c = 0; (cin >> c), c == 'y')
    {
      if(remove(pf.path())) // Всего лишь заменить на DeleteFile(file.c_str());
      {
        cout << "delete: " << file << "\n";
      }
      // ...
    }
    else
    {
      cout << "skip: " << file << "\n";
    }
  }

  system("pause");
}
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Код 2 соответствует ошибке ERROR_FILE_NOT_FOUND.
Возможно есть какие-то конвенции или ограничения на формат имени для DeleteFile
Почитай отсюдова https://docs.microsoft.com/en-us/windows/win32/api...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы