2012-05-16 1 views
1

으로 휴지통으로 여러 디렉토리 보내기 디렉토리 또는 파일을 휴지통으로 가져 오지 만 선택한 모든 항목을 묻는 메시지가 표시됩니다. 파일과 폴더 더미를 삭제할 때 좋지 않습니다.내 몇 가지 방법이 발견 다시 미세 조정오고, 기능의 부하와 함께 파일 브라우저를 만들기 FileSystem.DeleteDirectory

과도한 프롬프트없이 이것을 달성 할 수있는 방법은 없습니까? 아니면 SHFILEOPSTRUCT에 대해 알아봐야합니까?

귀하의 도움에 감사 드리며, 지금까지 90 %의 질문에 이미 답변 해 주셨습니다. 최고의 웹 사이트입니다.

+0

[this] (http://www.daveamenta.com/2008-05/c-delete-a-file-to-the-recycle-bin/) (및 다른 많은 기사) 당신은 오직 그 옵션을 가지고 있습니다 SHFILEOPSTRUCT – Steve

+0

답변으로 이것을 추가해야합니다 스티브, 아래의 "답변"은 모든 표를 얻고 있습니다. 당신의 도움을 주셔서 감사합니다. –

+0

글쎄, 나는 SHFILEOPSTRUCT로 예제를 만들려고 시도하고 대답을 할 것이다. Wait – Steve

답변

0

이 당신이
가}

using System.Runtime.InteropServices; 

class Win32ApiUtils 
{ 
    // Don't declare a value for the Pack size. If you omit it, the correct value is used when 
    // marshaling and a single SHFILEOPSTRUCT can be used for both 32-bit and 64-bit operation. 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
    public struct SHFILEOPSTRUCT 
    { 
     public IntPtr hwnd; 
     [MarshalAs(UnmanagedType.U4)] 
     public int wFunc; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string pFrom; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string pTo;    
     public ushort fFlags; 
     [MarshalAs(UnmanagedType.Bool)] 
     public bool fAnyOperationsAborted; 
     public IntPtr hNameMappings; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string lpszProgressTitle; 
    } 

    [DllImport("shell32.dll", CharSet = CharSet.Auto)] 
    static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp); 
    const int FO_DELETE = 3; 
    const int FOF_ALLOWUNDO = 0x40; 
    const int FOF_NOCONFIRMATION = 0x10; //Don't prompt the user.; 

    public static int DeleteFilesToRecycleBin(string filename) 
    { 
     SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT(); 
     shf.wFunc = FO_DELETE; 
     shf.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION; 
     shf.pFrom = filename + "\0"; // <--- this "\0" is critical !!!!! 
     int result = SHFileOperation(ref shf); 
     // Any value different from zero is an error to lookup 
     return result; 

    } 

프롬프트

없이 휴지통에있는 파일 및 디렉토리 이동에 필요한 것을 할 수있는 유일한 방법이 될 것으로 보인다

foreach (ListViewItem item in listView1.SelectedItems) 
    { 
     int result = Win32ApiUtils.DeleteFilesToRecycleBin(item.SubItems[3].Text); 
     if(result != 0) ...... // ??? throw ??? message to user and contine ??? 
    } 

- 경고 - 이 코드는 테스트해야합니다. PInvoke site에 SHFILEOPSTRUCT의 레이아웃을 찾았으며 해당 링크에 사용 된 문자열 선언에 대한 몇 가지 참고 사항이 있습니다.

음. 삭제할 단일 디렉토리가있는 Win7 64 비트에서 테스트되었습니다. 매력처럼 작동합니다 ....

+0

집에 돌아 가면 테스트 할 수 있지만 x64도 사용합니다.하지만 두 가지 모두와 호환되도록하기위한 몇 가지 팁을 접했습니다. 어쨌든 그것은 내 질문에 대답 해 주셔서 감사합니다. –

+0

또한 주목할 가치가 있습니다. System.Runtime.InteropServices 사용 –

+0

@ Deadly-Bagel right, updated – Steve

4

프롬프트를 표시하지 않으려면 FileSystem 메서드 대신 Directory.Delete을 사용할 수 있습니다. 그러면 디렉토리 및 파일과 하위 디렉토리가 삭제됩니다 (사용자가 원하는 경우).

+0

예,하지만이 작업은 파일을 완전히 삭제하고 휴지통으로 보내지 않으므로 내 용도에 맞지 않습니다. –

+1

사용자가 휴지통에서 복원하도록 하시겠습니까? 휴지통을 지우려면 파일을 휴지통에 두는 것이 좋을 것입니다. IMHO는이 작업을 2 단계로 처리합니다. 사용자가 휴지통에있는 파일을 볼 수있게하려는 경우) 직관적이지 않습니다. +1 리드. –

+2

나는 문맥없이 간단하게 질문하고있다. 어떻게 대안을 제안 할 수 있는가? –

관련 문제