ローカルNTFSドライブ上のごみ箱を検索
-
06-09-2019 - |
質問
私は、ローカルドライブ上のごみ箱のディレクトリを返しますいくつかの簡単なコードを書くしようとしています。 Googleで千の答えなければなりません - それはシンプルになりますように思えます。まだ1を発見していない:(
私はFATとNTFSドライブが異なるベース名(リサイクルとRECYCLER)を有することを見出しました。私は「」ごみ箱は、マシン上のすべてのドライブのごみ箱を組み合わせた仮想フォルダであることを発見しました。
でもベトナム語(または任意の他の非英語)のマシンに - ドライブのごみ箱のディレクトリ:私は何を発見していないと、Cを見つけるための方法です。
(私は見つけることができませポストは「RECYCLER」は国際かを取得しますかどうかを示していません)誰でも決定的な答えに私を指すことができますか?
おかげ
UPDATE:CSIDL_BITBUCKET
し、それを使用する関数の認識。私も読んだすべてのものから、それはすべてのドライブ上でそのユーザがすべて削除されたファイルの労働組合であるの仮想のディレクトリを指しています。物理的なリサイクルbinディレクトリを探して(Cのように見える私のVista上:私の知る限り、\ $ Recycle.Bin)
解決 2
レイモンド陳氏の助言を使用して、他の誰かの技術は私がドライブ上のごみ箱のディレクトリを検索する関数を提示し(私はそれを見つけた場所を覚えていないことができます)。ルートディレクトリ内のディレクトリを介して機能するサイクルは、隠されたおよび/またはシステムのディレクトリを見ています。それが1つを見つけると、それはCLSID_Recycleビンを持つものを探している子のサブディレクトリをチェックします。
私は2つのGetFolderCLSID機能を以下に含まれたことに注意してください。レイモンド陳氏のシンプルなものですが、それは、他の実装が長いですが、どこでも動作するように見える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 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 を使用します。 CDILパラメータとして CSIDL_BITBUCKET に渡します。