سؤال

أحاول كتابة بعض التعليمات البرمجية البسيطة التي سترجع الدليل لحيل سلة المحذوفات على محرك أقراص محلي. يبدو أنه سيكون بسيطة - يجب أن يكون ألف إجابة على جوجل. لم تكن موجودة بعد :(

لقد وجدت أن محركات الدهون و NTFS لها أسماء أسماء أساسية مختلفة (إعادة تدويرها وإعادة التدوير). لقد وجدت أن "سلة المعاد التدوير" هي مجلد افتراضي يجمع بين صناديق إعادة التدوير من جميع محركات الأقراص على الجهاز.

ما لم أجده هو وسيلة للعثور على Directory Directory C: حتى على آلة فيتنامية (أو أي جهاز آخر غير إنجليزي). (لا توجد مشاركات يمكنني أن أجد تشير إلى ما إذا كان "إعادة التدوير" تدويل أم لا)

هل يمكن لأي شخص أن يشير لي إلى إجابة نهائية؟

شكرا

تحديث: أدرك CSIDL_BITBUCKET والوظائف التي تستخدمها. من كل ما قرأته، إنه يشير إلى افتراضية الدليل الذي هو اتحاد جميع الملفات المحذوفة من قبل هذا المستخدم على جميع محركات الأقراص. تبحث عن دليل إعادة تدوير المادية (على نظام التشغيل Vista الخاص بي يبدو أنه C: $ recycle.bin بقدر ما أستطيع أن أقول)

هل كانت مفيدة؟

المحلول 2

باستخدام نصيحة Raymond Chen، وتقنية شخص آخر (لا أتذكر المكان الذي وجدت فيه) أقدم وظيفة ستجد دليل سلة المحذوفات على محرك أقراص. دورات الوظيفة من خلال الدلائل الموجودة في الدليل الجذر الذي ينظر إلى أدلة مخفية و / أو نظام النظام. عندما يجد المرء، فهو يتحقق من الدلائل الفرعية للأطفال التي تبحث عن واحدة تحتوي على صندوق CLSID_RECYCLE.

لاحظ أنني قمت بتضمين وظيفتين GetFolderClSID أدناه. Raymond Chen's هو واحد أبسط، لكنه لا يعمل على نظام التشغيل Windows 2000. التنفيذ الآخر أطول، ولكن يبدو أنه يعمل في كل مكان.

دعوة مثل: 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;
//}

نصائح أخرى

متأخرا بعض الشيء، ولكن ربما متأخرا أفضل من ...

بعد تصحيح الأخطاء shell32.dll، وجدت أنه لكل إصدار من Windows مسار إعادة التدوير هجودا، كما يعتمد على نظام الملفات لهذا المحرك. لقد اختبرت هذا على نظام التشغيل Windows XP و Vista و Windows7:

دع X: كن محرك الأقراص الذي نريد الحصول على المسار إلى سلة المحذوفات واترك SID يكون SID من المستخدم الحالي، ثم:


    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\\");
            }
        }
    }

مقالة Wiki تقدم نفس الحقائق:http://en.wikipedia.org/wiki/recycle_bin_٪28windows٪29.

في Win32، استخدم shgetspecialfolderlocation.. وبعد يمر csidl_bitbucket. كما المعلمة CDIL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top