Frage

Ich versuche, einige einfachen Code zu schreiben, der das Verzeichnis für den Papierkorb auf einem lokalen Laufwerk zurück. Scheint, wie wäre es einfach sein - sollte tausend Antworten auf Google sein. Haben Sie nicht ein noch gefunden: (

Ich habe festgestellt, dass FAT und NTFS-Laufwerke unterschiedliche Basisnamen haben (recycelten und Recycler). Ich habe festgestellt, dass ‚die‘ Papierkorb ist ein virtueller Ordner, der die Papierkörbe aller Antriebe auf der Maschine verbindet.

Was habe ich nicht gefunden ist ein Weg C zu finden: Autopapierkorb-Verzeichnis - auch auf einem vietnamesischen (oder einem anderen nicht-Englisch) Maschine. (Keine Beiträge, die ich finden kann angeben, ob „Recycler“ internationalisiert wird oder nicht)

Kann mir jemand auf eine endgültige Antwort darauf?

Danke

UPDATE: Aware von CSIDL_BITBUCKET und die Funktionen, die sie verwenden. Von allem, was ich aber gelesen habe, verweist er auf ein virtuellen Verzeichnis, das durch den Benutzer auf allen Laufwerken die Vereinigung aller gelöschten Dateien ist. Suche nach dem physischen Papierkorb-Verzeichnis (auf meinem Vista scheint es C zu sein: \ $ Recycle.Bin soweit ich sagen kann)

War es hilfreich?

Lösung 2

Mit Raymond Chen Rat, und jemand andere Technik (kann dich nicht erinnern, wo ich es gefunden) stellt ich eine Funktion, die das Papierkorb-Verzeichnis auf einem Laufwerk finden. Die Funktionszyklen durch die Verzeichnisse im Stammverzeichnis Blick auf versteckte und / oder Systemverzeichnisse. Wenn es einen findet, überprüft er die Unterverzeichnisse Kind für einen suchen, der CLSID_Recycle Bin hat.

Beachten Sie, dass ich zwei unter GetFolderCLSID Funktionen enthalten haben. Raymond Chen ist die einfachere, aber es funktioniert nicht auf Windows 2000. Die andere Implementierung ist länger, aber scheint überall zu arbeiten.

Aufruf wie: CString recycleDir FindRecycleBinOnDrive = (L "C: \");

CString FindRecycleBinOnDrive(LPCWSTR path)
{
    CString search;
    search.Format(L"%c:\\*", path[0]);
    WIN32_FIND_DATA fd = {0};
    HANDLE fHandle = FindFirstFile(search, &fd);
    while(INVALID_HANDLE_VALUE != fHandle)
    {
        if(FILE_ATTRIBUTE_DIRECTORY == (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) //only check directories
        {
            if(0 != (fd.dwFileAttributes & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN))) //only check hidden and/or system directories
            {
                //the recycle bin directory itself won't be marked, but a SID-specific child directory will, so now look at them
                CString childSearch;
                childSearch.Format(L"%c:\\%s\\*", path[0], fd.cFileName);
                WIN32_FIND_DATA childFD = {0};
                HANDLE childHandle = FindFirstFile(childSearch, &childFD);
                while(INVALID_HANDLE_VALUE != childHandle)
                {
                    if((FILE_ATTRIBUTE_DIRECTORY == (childFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) && //only check directories
                        (childFD.cFileName[0] != L'.')) //don't check . and .. dirs
                    {
                        CString fullPath;
                        fullPath.Format(L"%c:\\%s\\%s", path[0], fd.cFileName, childFD.cFileName);
                        CLSID id = {0};
                        HRESULT hr = GetFolderCLSID(fullPath, id);
                        if(SUCCEEDED(hr))
                        {
                            if(IsEqualGUID(CLSID_RecycleBin, id))
                            {
                                FindClose(childHandle);
                                FindClose(fHandle);
                                //return the parent (recycle bin) directory
                                fullPath.Format(L"%c:\\%s", path[0], fd.cFileName);
                                return fullPath;
                            }
                        }
                        else
                        {
                            Log(logERROR, L"GetFolderCLSID returned %08X for %s", hr, fullPath);
                        }
                    }

                    if(FALSE == FindNextFile(childHandle, &childFD))
                    {
                        FindClose(childHandle);
                        childHandle = INVALID_HANDLE_VALUE;
                    }
                }
            }
        }
        if(FALSE == FindNextFile(fHandle, &fd))
        {
            FindClose(fHandle);
            fHandle = INVALID_HANDLE_VALUE;
        }
    }
    _ASSERT(0);
    return L"";
}


//Works on Windows 2000, and even as Local System account
HRESULT GetFolderCLSID(LPCWSTR path, CLSID& pathCLSID)
{
    LPMALLOC pMalloc = NULL;
    HRESULT hr = 0;
    if (SUCCEEDED(hr = SHGetMalloc(&pMalloc))) 
    {
        LPSHELLFOLDER pshfDesktop = NULL;
        if (SUCCEEDED(hr = SHGetDesktopFolder(&pshfDesktop))) 
        {
            LPITEMIDLIST pidl = NULL;
            DWORD dwAttributes = SFGAO_FOLDER;
            if (SUCCEEDED(hr = pshfDesktop->ParseDisplayName(NULL, NULL, (LPWSTR)path, NULL, &pidl, &dwAttributes))) 
            {
                LPPERSIST pPersist = NULL;
                if (SUCCEEDED(hr = pshfDesktop->BindToObject(pidl, NULL, IID_IPersist, (LPVOID *) &pPersist))) 
                {
                    hr = pPersist->GetClassID(&pathCLSID); 
                    pPersist->Release();
                } 
                pMalloc->Free(pidl);
            } 
            pshfDesktop->Release();
        } 
        pMalloc->Release();
    }
    return hr;
}


//Not supported on Windows 2000 since SHParseDisplayName wasn't implemented then
//HRESULT GetFolderCLSID(LPCWSTR pszPath, CLSID& pathCLSID)
//{
//  SHDESCRIPTIONID did = {0};
//  HRESULT hr = 0;
//  LPITEMIDLIST pidl = NULL;
//  if (SUCCEEDED(hr = SHParseDisplayName(pszPath, NULL, &pidl, 0, NULL))) //not supported by Windows 2000
//  {
//      IShellFolder *psf = NULL;
//      LPCITEMIDLIST pidlChild = NULL;
//      if (SUCCEEDED(hr = SHBindToParent(pidl, IID_IShellFolder, (void**)&psf, &pidlChild))) 
//      {
//          hr = SHGetDataFromIDList(psf, pidlChild, SHGDFIL_DESCRIPTIONID, &did, sizeof(did));
//          psf->Release();
//          pathCLSID = did.clsid;
//      }
//      CoTaskMemFree(pidl);
//  }
//  return hr;
//}

Andere Tipps

Ein wenig spät, aber vielleicht besser spät als nie ...

Nach shell32.dll debuggen, habe ich festgestellt, dass der Recycling-Pfad für jede Version von Windows ist hartcodiert und auch, abhängig von dem Dateisystem des Laufwerks. Ich habe dies auf Windows XP, Vista und Windows7 getestet:

Es sei X: das Laufwerk wir den Weg in den Papierkorb bekommen und lassen SID das SID des aktuellen Benutzers sein, dann:


    switchif(OsType) {
        case WindowsXP:
        {
            if(PartitionType("X:") == NTFS)
            {
                printf("Path is: X:\\Recycler\\SID\\");
            }
            else
            {
                printf("Path is X:\\RECYCLED\\");
            }
        }

        case WindowsVista:
        case Windows7:
        {
            if(PartitionType("X:") == NTFS)
            {
                printf("Path is: X:\\$Recycle.bin\\SID\\");
            }
            else
            {
                printf("Path is X:\\$RECYCLE.BIN\\");
            }
        }
    }

Ein Wiki Artikel stellt die gleichen Fakten: http://en.wikipedia.org/wiki/Recycle_Bin_%28Windows%29

In Win32 verwenden SHGetSpecialFolderLocation . Pass CSIDL_BITBUCKET als CDIL Parameter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top