2016-06-24 1 views
-1

У меня есть этот источник C++, чтобы найти *.do файлов в c:\.Удалить найденный файл в C:

Проблема моя, вместо того чтобы показывать их, я хочу удалить их.

Как удалить все файлы *.do в c:\? Мой код показывает только путь к каталогу, вместо которого я хочу удалить.

#include <windows.h> 
#include <string> 
#include <iostream> 

void GetFileListing(std::string directory, std::string fileFilter, bool recursively = true) 
{ 
    if (recursively) 
    GetFileListing(directory, fileFilter, false); 

    directory += "\\"; 

    WIN32_FIND_DATA FindFileData; 
    HANDLE hFind = INVALID_HANDLE_VALUE; 

    std::string filter = directory + (recursively ? "*" : fileFilter); 

    hFind = FindFirstFile(filter.c_str(), &FindFileData); 

    if (hFind == INVALID_HANDLE_VALUE) 
    { 
    return; 
    } 
    else 
    { 
    if (!recursively) 
    { 
     std::cout << directory + std::string(FindFileData.cFileName) << std::endl; 
    } 

    while (FindNextFile(hFind, &FindFileData) != 0) 
    { 
     if (!recursively) 
     { 
     std::cout << directory + std::string(FindFileData.cFileName) << std::endl; 
     } 
     else 
     { 
     if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)>0 && FindFileData.cFileName[0]!='.') 
     { 
      GetFileListing(directory + std::string(FindFileData.cFileName), fileFilter); 
     } 
     } 
    } 

    DWORD dwError = GetLastError(); 
    FindClose(hFind); 
    if (dwError != ERROR_NO_MORE_FILES) 
    { 
     std::cout << "FindNextFile error. Error is "<< dwError << std::endl; 
    } 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    GetFileListing("c:\\", "*.do"); 
} 
+3

C = C++. Ваш вопрос о том или ином. Они не являются одним и тем же языком, и теги не являются синонимами. Тэги актуальны здесь - используйте ** только ** теги, которые действительно применимы к вашему вопросу. –

+3

Его вопрос о C++. «C» в теме - это диск, а не язык. – user31264

ответ

1

Вы ищете DeleteFile(), например:

#include <windows.h> 
#include <Shlwapi.h> 

#include <iostream> 
#include <string> 
#include <vector> 

#pragma comment(lib, "shlwapi.lib");  

void GetFolderListing(std::string directory, const std::string &fileFilter, std::vector<std::string> *subfolders, std::vector<std::string> *files) 
{  
    if (!directory.empty() && (*directory.rbegin() != '\\')) 
     directory += "\\"; 

    std::string filter = directory; 
    if (subfolders) 
     filter += "*"; 
    else 
     filter += fileFilter; 

    WIN32_FIND_DATAA FindFileData; 
    HANDLE hFind; 
    DWORD dwError; 

    hFind = FindFirstFileA(filter.c_str(), &FindFileData); 
    if (hFind == INVALID_HANDLE_VALUE) 
    { 
     dwError = GetLastError(); 
     if (dwError != ERROR_FILE_NOT_FOUND) 
      std::cout << "FindFirstFile error " << dwError << std::endl; 
     return; 
    } 

    do 
    { 
     if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
     { 
      if ((subfolders) && 
       (lstrcmpA(FindFileData.cFileName, ".") != 0) && 
       (lstrcmpA(FindFileData.cFileName, "..") != 0)) 
      { 
       subfolders->push_back(directory + FindFileData.cFileName); 
      } 
     } 
     else 
     { 
      if ((files) && 
       ((!subfolders) || PathMatchSpecA(FindFileData.cFileName, fileFilter.c_str()))) 
      { 
       files->push_back(directory + FindFileData.cFileName); 
      } 
     } 
    } 
    while (FindNextFileA(hFind, &FindFileData)); 

    dwError = GetLastError(); 
    FindClose(hFind); 
    if (dwError != ERROR_NO_MORE_FILES) 
     std::cout << "FindNextFile error " << dwError << std::endl; 
} 

void DeleteFiles(const std::string &directory, const std::string &fileFilter, bool recursively = true) 
{  
    std::vector<std::string> folders; 
    std::vector<std::string> files; 

    GetFolderListing(directory, fileFilter, (recursively) ? &folders : NULL, &files); 

    for (std::vector<std::string>::iterator iter = files.begin(); iter != files.end(); ++iter) 
     DeleteFileA(iter->c_str()); 

    if (recursively) 
    { 
     for (std::vector<std::string>::iterator iter = folders.begin(); iter != folders.end(); ++iter) 
      DeleteFiles(*iter, fileFilter, true); 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    DeleteFiles("c:\\", "*.do"); 
} 

Или, используя Unicode (которые вы должны использовать вместо ANSI):

#include <windows.h> 
#include <Shlwapi.h> 

#include <iostream> 
#include <string> 
#include <vector> 

#pragma comment(lib, "shlwapi.lib");  

void GetFolderListing(std::wstring directory, const std::wstring &fileFilter, std::vector<std::wstring> *subfolders, std::vector<std::wstring> *files) 
{  
    if (!directory.empty() && (*directory.rbegin() != L'\\')) 
     directory += L"\\"; 

    std::wstring filter = directory; 
    if (subfolders) 
     filter += L"*"; 
    else 
     filter += fileFilter; 

    WIN32_FIND_DATAW FindFileData; 
    HANDLE hFind; 
    DWORD dwError; 

    hFind = FindFirstFileW(filter.c_str(), &FindFileData); 
    if (hFind == INVALID_HANDLE_VALUE) 
    { 
     dwError = GetLastError(); 
     if (dwError != ERROR_FILE_NOT_FOUND) 
      std::cout << "FindFirstFile error " << dwError << std::endl; 
     return; 
    } 

    do 
    { 
     if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
     { 
      if ((subfolders) && 
       (lstrcmpW(FindFileData.cFileName, L".") != 0) && 
       (lstrcmpW(FindFileData.cFileName, L"..") != 0)) 
      { 
       subfolders->push_back(directory + FindFileData.cFileName); 
      } 
     } 
     else 
     { 
      if ((files) && 
       ((!subfolders) || PathMatchSpecW(FindFileData.cFileName, fileFilter.c_str()))) 
      { 
       files->push_back(directory + FindFileData.cFileName); 
      } 
     } 
    } 
    while (FindNextFileW(hFind, &FindFileData)); 

    dwError = GetLastError(); 
    FindClose(hFind); 
    if (dwError != ERROR_NO_MORE_FILES) 
     std::cout << "FindNextFile error " << dwError << std::endl; 
} 

void DeleteFiles(const std::wstring &directory, const std::wstring &fileFilter, bool recursively = true) 
{  
    std::vector<std::wstring> folders; 
    std::vector<std::wstring> files; 

    GetFolderListing(directory, fileFilter, (recursively) ? &folders : NULL, &files); 

    for (std::vector<std::wstring>::iterator iter = files.begin(); iter != files.end(); ++iter) 
     DeleteFileW(iter->c_str()); 

    if (recursively) 
    { 
     for (std::vector<std::wstring>::iterator iter = folders.begin(); iter != folders.end(); ++iter) 
      DeleteFiles(*iter, fileFilter, true); 
    } 
} 

int wmain(int argc, wchar_t* argv[]) 
{ 
    DeleteFiles(L"c:\\", L"*.do"); 
} 
+0

О, кажется удивительно! но дайте мне несколько erros: строка 21 'cout' не является членом 'std' линия 21 'endl' не является членом 'std' линия 45 ожидается ')' до 'continue' линия 57 'cout' не является членом 'std' линия 57 'endl' не является членом 'std' строка 64 имя поиск 'iter' изменен для ISO 'for' scoping [-fpermissive] –

+1

Ошибки 'std' были из-за того, что Я изначально удалил вызовы 'std :: cout', а затем удалил' #include ', а затем снова добавил 'std :: cout', но забыл снова добавить' #include '. Я исправил это. –

+0

спасибо! теперь он показывает мне только одну ошибку: (.text + 0x1f5): неопределенная ссылка на '_imp__PathMatchSpecA @ 8 ', что я делаю неправильно? –

2

сделать некоторые container (вероятно std::list<std::string>, возможно, std::set<std::string> или std::vector<std::string>), содержащий коллекции найденных путей (абсолютный) файл, а затем удалить все из них (с помощью std::filesystem::remove или просто C remove ...)

Так у вас есть два этапа: первый, вы итерация в файловой системе, чтобы найти соответствующие файлы (на Linux, я хотел бы использовать nftw(3) для этого, может быть, вашей операционной системы имеет что-то подобное), не снимая их (но собирая их полного путь к файлу в контейнере). Во-вторых, вы перебираете контейнер, чтобы удалить каждый путь к файлу.

+0

Благодарю вас за ответ. Не могли бы вы привести мне пример, что-то вроде этого? 'std :: remove << directory + std :: string (FindFileData.cFileName) << std :: endl;' –

+1

Нет, создайте полный абсолютный путь к файлу и добавьте его в контейнер и повторите со следующим найденным файлом , –

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