È stato utile?

Soluzione

C'è un piccolo problema qui. Il Cestino di Windows è una cartella virtuale e in realtà non esiste. I file che vedete non sono in realtà in quella cartella, sono la rappresentazione di file esistenti sul disco che sono stati rinominati a un nome speciale, che "rimuove" dal file system visibile, ma non quello fisico.

È possibile "prova" questo per te, chiedendo per la posizione della cartella utilizzando l'API Win32. Si tornerà E_FAIL per il Cestino, ma non per altre cartelle (vedi SHGetKnownFolderPath su PInvoke .net ( e su MSDN ) per tutte le costanti che è possibile utilizzare e le dichiarazioni necessarie per questo codice per eseguire):

IntPtr ptrRecycleBinPath;
// try it with KnownFolder.QuickLaunch to see it working:
HRESULT hr = (HRESULT) SHGetKnownFolderPath(
     KnownFolder.RecycleBinFolder, 
     0, 
     IntPtr.Zero, 
     out ptrRecycleBinPath);

if (hr == HRESULT.E_FAIL)
{
    Console.WriteLine("No folder avaialable, virtual folder");
}
else if (hr == HRESULT.S_OK)
{
    string RecycleBinPath = Marshal.PtrToStringUni(ptrRecycleBinPath);
    Marshal.FreeCoTaskMem(ptrRecycleBinPath);
    Console.WriteLine("path: " + RecycleBinPath);
}

// for convenience, you can use the code above
// directly if you paste the follow declarations in your class:

// get a "known path"
[DllImport("shell32.dll")]
static extern long SHGetKnownFolderPath(
    [MarshalAs(UnmanagedType.LPStruct)] Guid rfid, 
    uint dwFlags, 
    IntPtr hToken, 
    out IntPtr pszPath);

// known folder GUID declarations
public static class KnownFolder
{
    // many more entries exist, left out for clarity here

    public static readonly Guid RecycleBinFolder = 
         new Guid("B7534046-3ECB-4C18-BE4E-64CD4CB7D6AC");

    public static readonly Guid QuickLaunch = 
         new Guid("52a4f021-7b75-48a9-9f6b-4b87a210bc8f");

    //....
}

// results of COM invocations:
enum HRESULT : uint
{
    S_FALSE = 0x0001,
    S_OK = 0x0000,
    E_FAIL = 0x80004005,
    E_INVALIDARG = 0x80070057,
    E_OUTOFMEMORY = 0x8007000E
}

Il nomecartella falso "$ Recycle.bin" si ripete per ogni unità. Il nome nascosto non è memorizzato nel Registro di sistema e non è raggiungibile con l'API in quanto tale. La precedenza suggerito KnownFolderHelper non recuperare queste informazioni sia (lo stesso lib ha un metodo chiamato per ottenere il Cestino, ma ha anche un GetPath, girerà a mani vuote).

Ma non tutto è perduto. Questo non esistente- "nome file" falso o "nome della cartella" contiene un file nascosto che assomiglia a "S-1-5-21-2703390745-3900912742-210389625-1000" (il vostro sarà diverso). E 'uno dei due modi "affidabili" per scoprire se un certo file è in realtà una directory virtuale del cestino (il contrario dell'essere: eliminare un file tramite SHFileOperation , spiegato qui , e verificare se compare nella cartella che avete):

string [] entries = Directory.GetFileSystemEntries(@"c:\$Recycle.bin", "?-?-?-??*");
if(entries.Length > 0)
   // we have a winner
else 
   // no, not the recycle bin

Nota: Non so che cosa le cartelle nascoste sono altre versioni Win32, you'l devono sperimentare un po '. Tutti hanno il sistema e impostare la bandiera nascosta e l'aspetto di un GUID maciullato.

La documentazione API non sono molto chiare a riguardo, ma se avete bisogno di conferma, questa pagina spiega che c'è davvero alcun percorso che può essere recuperato ( vecchio pagina CSIDL correlata è molto meno chiaro su di esso).

Aggiornamento: approcci alternativi con SHGetSpecialFolderPath , SHGetSpecialFolderLocation , ShellAPI.SHGetFolderLocation e SHGetPathFromIDList tutte falliscono con la stessa: o un risultati vuoto o un errore. Ho provato tutte le funzioni sia per Cestino e per AppData (per essere sicuri che ho usato i parametri corretti).

Solo la documentazione sul ShGetPathFromIDListEx ha detto che esplicitamente, citazione:. "Fatta eccezione per i nomi di stampante UNC, se la posizione specificata dal parametro PIDL non fa parte del file system, questa funzione viene a mancare"

Altri suggerimenti

di Windows Codice Confezione API contiene questa funzionalità.

Per ottenere la cartella del Cestino, utilizzare

Microsoft.WindowsAPICodePack.Shell.KnownFolderHelper.FromPath("::{645FF040-5081-101B-9F08-00AA002F954E}");

Non ho idea di che cosa significa che stringa, ma è stato incluso nella documentazione come il riferimento al Cestino.

Spero che questo aiuti:)

La maggior parte dei metodi relativi cestino sono stati scritti in C ++ come lei ha ricordato. Si potrebbe creare una classe wrapper nell'applicazione utilizzando il estensioni gestite a C ++ , allora si dovrà utilizzare dllImport in questo modo:

using System;
using System.Runtime.InteropServices;

class MainApp
{
[DllImport("user32.dll", EntryPoint="MessageBox")]
public static extern int MessageBox(int hWnd, String strMessage, String
strCaption, uint uiType);

public static void Main()
{
MessageBox( 0, "Hello, this is PInvoke in operation!", ".NET", 0 );
}
}

Ci sono anche articoli là fuori che fanno questo in qualche altro modo con C #, la maggior parte di loro usano PInvoke o fare affidamento sulla cartella con $ Recycle nel suo nome. Di seguito sono riportati alcuni link che ho trovato per questo argomento

http: // sociale .msdn.microsoft.com / Forum / it / csharpgeneral / thread / 05f1476f-a101-4766-847b-0bdf4f6ad397

http://www.codeproject.com/KB/shell/recyclebin.aspx

http://www.pinvoke.net/default.aspx/shell32.SHFileOperation

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top