রিসাইকেল বিনকে একটি ফাইল প্রেরণ করুন


85

বর্তমানে আমি নিম্নলিখিত ফাংশনটি ব্যবহার করছি

file.Delete();

তবে আমি এই ফাংশনটি কীভাবে কেবল ফাইলটিকে সরাসরি মুছে ফেলার পরিবর্তে পুনর্ব্যবহারযোগ্য বিনে একটি ফাইল প্রেরণ করতে পারি?



4
@ উউইকিমের লিঙ্কটি এখন মারা গেছে, আপনি এখানে এমএসডিএন ম্যাগাজিনের (ডিসেম্বর 2007) .chm ফর্ম্যাট সংস্করণটি খুঁজে পেতে পারেন , নিবন্ধটি বলা হয় .NET Matters: IFileOperation in Windows Vistaএবং এটি Columnsফোল্ডারে পাওয়া যায় ।
জুন

নিবন্ধটি আমার জন্য .chm ফাইলে খোলে না। এই লিঙ্কটি কাজ করে: ডকস.মাইক্রোসফট
en-

এছাড়াও আপনাকে FOFX_RECYCLEONDELETE = 0x00080000অপারেশন ফ্ল্যাগগুলিতে যুক্ত করতে হবে এবং এই পতাকাটি কেবল উইন্ডোজ 8 বা তত উপরে সমর্থিত।
এলোমেলোভাবে

উত্তর:


54

দ্রষ্টব্য: এটি উইন্ডোজ পরিষেবাদির মতো নন ইউআই ইন্টারেক্টিভ অ্যাপগুলির সাথেও কাজ করে না

এই মোড়ক আপনাকে প্রয়োজনীয় কার্যকারিতা সরবরাহ করতে পারে:

using System.Runtime.InteropServices;

public class FileOperationAPIWrapper
    {
        /// <summary>
        /// Possible flags for the SHFileOperation method.
        /// </summary>
        [Flags]
        public enum FileOperationFlags : ushort
        {
            /// <summary>
            /// Do not show a dialog during the process
            /// </summary>
            FOF_SILENT = 0x0004,
            /// <summary>
            /// Do not ask the user to confirm selection
            /// </summary>
            FOF_NOCONFIRMATION = 0x0010,
            /// <summary>
            /// Delete the file to the recycle bin.  (Required flag to send a file to the bin
            /// </summary>
            FOF_ALLOWUNDO = 0x0040,
            /// <summary>
            /// Do not show the names of the files or folders that are being recycled.
            /// </summary>
            FOF_SIMPLEPROGRESS = 0x0100,
            /// <summary>
            /// Surpress errors, if any occur during the process.
            /// </summary>
            FOF_NOERRORUI = 0x0400,
            /// <summary>
            /// Warn if files are too big to fit in the recycle bin and will need
            /// to be deleted completely.
            /// </summary>
            FOF_WANTNUKEWARNING = 0x4000,
        }

        /// <summary>
        /// File Operation Function Type for SHFileOperation
        /// </summary>
        public enum FileOperationType : uint
        {
            /// <summary>
            /// Move the objects
            /// </summary>
            FO_MOVE = 0x0001,
            /// <summary>
            /// Copy the objects
            /// </summary>
            FO_COPY = 0x0002,
            /// <summary>
            /// Delete (or recycle) the objects
            /// </summary>
            FO_DELETE = 0x0003,
            /// <summary>
            /// Rename the object(s)
            /// </summary>
            FO_RENAME = 0x0004,
        }



        /// <summary>
        /// SHFILEOPSTRUCT for SHFileOperation from COM
        /// </summary>
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        private struct SHFILEOPSTRUCT
        {

            public IntPtr hwnd;
            [MarshalAs(UnmanagedType.U4)]
            public FileOperationType wFunc;
            public string pFrom;
            public string pTo;
            public FileOperationFlags fFlags;
            [MarshalAs(UnmanagedType.Bool)]
            public bool fAnyOperationsAborted;
            public IntPtr hNameMappings;
            public string lpszProgressTitle;
        }

        [DllImport("shell32.dll", CharSet = CharSet.Auto)]
        private static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);

        /// <summary>
        /// Send file to recycle bin
        /// </summary>
        /// <param name="path">Location of directory or file to recycle</param>
        /// <param name="flags">FileOperationFlags to add in addition to FOF_ALLOWUNDO</param>
        public static bool Send(string path, FileOperationFlags flags)
        {
            try
            {
                var fs = new SHFILEOPSTRUCT
                                        {
                                            wFunc = FileOperationType.FO_DELETE,
                                            pFrom = path + '\0' + '\0',
                                            fFlags = FileOperationFlags.FOF_ALLOWUNDO | flags
                                        };
                SHFileOperation(ref fs);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// Send file to recycle bin.  Display dialog, display warning if files are too big to fit (FOF_WANTNUKEWARNING)
        /// </summary>
        /// <param name="path">Location of directory or file to recycle</param>
        public static bool Send(string path)
        {
            return Send(path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_WANTNUKEWARNING);
        }

        /// <summary>
        /// Send file silently to recycle bin.  Surpress dialog, surpress errors, delete if too large.
        /// </summary>
        /// <param name="path">Location of directory or file to recycle</param>
        public static bool MoveToRecycleBin(string path)
        {
            return Send(path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_NOERRORUI | FileOperationFlags.FOF_SILENT);

        }

        private static bool deleteFile(string path, FileOperationFlags flags)
        {
            try
            {
                var fs = new SHFILEOPSTRUCT
                                        {
                                            wFunc = FileOperationType.FO_DELETE,
                                            pFrom = path + '\0' + '\0',
                                            fFlags = flags
                                        };
                SHFileOperation(ref fs);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public static bool DeleteCompletelySilent(string path)
        {
            return deleteFile(path,
                              FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_NOERRORUI |
                              FileOperationFlags.FOF_SILENT);
        }
    }

আমি কীভাবে এটি ব্যবহার করব বুঝতে পারছি না ... আপনি কি ব্যাখ্যা করতে পারেন?
muttley91

4
64 বিট প্ল্যাটফর্মের জন্য সংকলন করলে প্যাক = 1 সরান (এটি অন্যথায় ব্যর্থ হবে)। প্যাক = 1 উল্লেখ ছাড়াই এটি 32 বিট এবং 64 বিট উভয়ের জন্যই কাজ করবে। pinvoke.net/default.aspx/Structures/SHFILEOPomotCT.html
শন

4
প্যাক = 1 ব্যবহার করার সময়, একটি অ্যাক্সেসভিওলেশন এক্সসেপশন নিক্ষেপ করা হয়েছিল। এটি মুছে ফেলা কৌশলটি করেছে। পথে 64-বিট উইন্ডোজ
P1nGu1n

4
এমনকি এই কোডটি চালানোর জন্য প্রয়োজনীয়তাগুলি কী? আমি প্যাক = 1 সরান তবে এটি এখনও সংকলন করে না। DllImport, DllImportAttribute, MarshalAs, MarshalAsAtribute, StructLayout, StructLayoutAttribute নেমস্পেস হিসাবে উপস্থিত নেই। কোনও সহায়তা দয়া করে ধন্যবাদ :)
শুদ্ধপরিচয়

4
SHFileOperation দীর্ঘ পাথ পরিচালনা করে না এবং MAX_PATH (এমনকি একটি \\? F উপসর্গ সহ) এর চেয়ে দীর্ঘ পাথগুলিতে ব্যর্থ হবে।
মেলভিন

157

ব্যবহারের FileSystem.DeleteFile এবং ডান উল্লেখ RecycleOption

এটি ইউআই ইন্টারেক্টিভ অ্যাপ্লিকেশনগুলির সাথে কাজ করবে, এটি উইন্ডোজ পরিষেবা অ্যাপের মতো ইউআই ইন্টারেক্টিভ অ্যাপগুলির সাথে কাজ করবে না।


18
@ নলডোরিন এটি একটি নিখুঁত সমাধান, ডাউন ডাউনের প্রাপ্য নয়। আমি কেন ভিজুয়ালবাসিক লাইব্রেরিতে অ্যাক্সেস করা "কুশ্রী" এর একটি উল্লেখ চাই।
jsmith

7
@ নলডোরিন: বিশেষত এক্ষেত্রে Microsoft.VisualBasic.FileIO.FileSystemএখানে পোস্ট করা উদাহরণটি ব্যবহার করে মূলত একই কাজ করা হয় SHFileOperation
ডার্ক ভোলমার

20
@ নলডোরিন: কুরুচি, হাহ? আমার জন্য উইনাপি উপায়টি উপায় কুরুচিপূর্ণ - এছাড়াও, আপনার কিছু জগাখিচুড়ি করা ভাল শট আছে। আমি ব্যক্তিগতভাবে ভিবি সিনট্যাক্সকে অপছন্দ করি তবে সমাবেশগুলিতে এটি ঠিক ILতাই আমার আপত্তি নেই। ভিবি সমাবেশ একই WinAPI ফাংশনটিকে বিটিডব্লু বলে।
জারোস্লাভ জান্দেক

7
@ নলডোরিন: অপ্রচলিত? আপনি কি অ্যাসেম্বলি ভুল করে ভুল করেছেন Microsoft.VisualBasic.Compatibility? যে আমি চাই এড়ানো। দেখে মনে হচ্ছে না এটি শীঘ্রই যে কোনও সময় হ্রাস করা হবে (এটি আরডিএল রিপোর্টিং ইঞ্জিন ইত্যাদিতে ব্যবহৃত হয়)।
জারোস্লাভ জান্দেক

7
@ নলডোরিন: একটি বিল্ট-ইন ফ্রেমওয়ার্ক সমাবেশটি শেল 32.dll-তে কঠোর স্টাইলের ম্যাপিংয়ের চেয়ে আরও ভাল সমাধান বলে মনে হচ্ছে। ফ্রেমওয়ার্ক সমাবেশগুলি ব্যবহার করে আপনি পরিবর্তনটি পোর্টেবল এবং পরবর্তী বিবর্তনগুলি পেতে পারেন। সিস্টেম লাইব্রেরিতে ম্যাপিং, আপনি যে কোনও দিন অপ্রচলিত হওয়ার জন্য সমস্ত সম্ভাবনা
নিচ্ছেন

41

এমএসডিএন থেকে :

মাইক্রোসফ্ট.ভিউজুয়াল বেসিক সমাবেশে একটি রেফারেন্স যুক্ত করুন। প্রয়োজনীয় ক্লাসটি এই লাইব্রেরিতে পাওয়া যায়।

ফাইলের শীর্ষে স্টেটমেন্ট ব্যবহার করে এটি যুক্ত করুন using Microsoft.VisualBasic.FileIO;

FileSystem.DeleteFileকোনও ফাইল মুছতে ব্যবহার করুন, এতে রিসাইকেল বিন বা না উল্লেখ করার বিকল্প রয়েছে।

FileSystem.DeleteDirectoryঅপসারণের সাথে ডিরেক্টরিটি পুনর্ব্যবহারযোগ্য বিনে প্রেরণ বা না পাঠাতে নির্দিষ্ট করে মুছতে ব্যবহার করুন ।


মাইক্রোসোকট.ভিজুয়ালবাসিক সহ সমস্যাটি হ'ল এটি আমার প্রোগ্রামের অন্যথায় কোথাও অনুসন্ধান অপশন ব্যবহারের সাথে বিরোধিতা করে (গেটফিলস () ফাংশনের অংশ)।
muttley91

8
"রার ডাউনউভোট এখনও বিতর্কিত নয় কারণ এটি" বিরোধের কারণে ভিজ্যুয়াল বেসিক লাইব্রেরিটি উল্লেখ করা যায় না "এই প্রশ্নে নির্দিষ্ট করা হয়নি। যা আপনি আপনার কোডে সহজেই সমাধান করতে পারেন। stackoverflow.com/questions/1317263/…
jsmith

4
এই পদ্ধতিটি অভ্যন্তরীণভাবে SHFileOperation ব্যবহার করে বলে মনে হচ্ছে যা দীর্ঘ পাথ পরিচালনা করে না এবং MAX_PATH (এমনকি একটি \\? F উপসর্গ সহ) দীর্ঘতর পাথগুলিতে ব্যর্থ হবে।
মেলভিন

18

নিম্নলিখিত সমাধানগুলি অন্যগুলির তুলনায় সহজ:

using Shell32;

static class Program
{
    public static Shell shell = new Shell();
    public static Folder RecyclingBin = shell.NameSpace(10);

    static void Main()
    {
        RecyclingBin.MoveHere("PATH TO FILE/FOLDER")
    }
}

আপনি এই লাইব্রেরিটি ব্যবহার করে পুনর্ব্যবহারযোগ্য বিনের অন্যান্য কার্যকারিতা ব্যবহার করতে পারেন।

প্রথমে, Shell32নেমস্পেসটি ব্যবহার করতে সক্ষম হতে লাইব্রেরিটি "মাইক্রোসফ্ট শেল কন্ট্রোলস অ্যান্ড অটোমেশন" (সিওএম মেনু থেকে) যুক্ত করতে ভুলবেন না । এটি আপনার প্রোগ্রামের সাথে সংকলিত না হয়ে গতিশীলভাবে আপনার প্রকল্পের সাথে যুক্ত হবে।

[1]: https://i.stack.imgur.com/erV


8
আপনার উত্তরটি আরও ভাল হবে যখন আপনি প্রথম অনুচ্ছেদে অন্যান্য উত্তরগুলি মন্তব্য করার পরিবর্তে সমাধানের দিকে মনোনিবেশ করেন। এছাড়াও, স্বচ্ছতার স্বার্থে আমি প্রতিস্থাপন চাই 10দ্বারা Shell32.ShellSpecialFolderConstants.ssfBITBUCKET। এটির জন্য দ্বিতীয় প্যারামিটারটি উল্লেখ করার মতো হতে পারে MoveHere, 64 এর মতো বিকল্পগুলি ("যদি সম্ভব হয় তবে তথ্য পূর্বাবস্থায় সংরক্ষণ করুন") regarding এমএসডিএন থেকে কিছু ডকুমেন্টেশন উত্স লিঙ্ক করা একটি দুর্দান্ত সমাপ্তি হবে।
গ্রেক 40

4
দেখে মনে হচ্ছে মুভ হিয়ারে কলটি কোনও ত্রুটি দেখায় না: অ-বিদ্যমান ফাইলটিতে কল করা নিঃশব্দে ব্যর্থ হয়! এটি "\\? \" উপসর্গের সাথে বা ছাড়া MAX_CHARS এর চেয়ে দীর্ঘ পথগুলিতেও নিঃশব্দে ব্যর্থ হয় ...
মেলভিনি

13

দুর্ভাগ্যক্রমে আপনার ফাইলটি রিসাইকেল বিনে সরানোর জন্য Win32 এপিআই অবলম্বন করতে হবে। এই পোস্টের উপর ভিত্তি করে নিম্নলিখিত কোড চেষ্টা করুন । এটি SHFileOperationউইন্ডোজ শেলের মাধ্যমে ফাইল সিস্টেম অপারেশনের জন্য জেনেরিক ফাংশনটি ব্যবহার করে।

নিম্নলিখিতটি সংজ্ঞায়িত করুন (একটি ইউটিলিটি ক্লাসে সম্ভবত সেরা)।

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto, Pack=1)]
public struct SHFILEOPSTRUCT
{
        public IntPtr hwnd;
        [MarshalAs(UnmanagedType.U4)] public int wFunc;
        public string pFrom;
        public string pTo;
        public short fFlags;
        [MarshalAs(UnmanagedType.Bool)] public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        public string lpszProgressTitle;
}

[DllImport("shell32.dll", CharSet=CharSet.Auto)]
public static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);

public const int FO_DELETE = 3;
public const int FOF_ALLOWUNDO = 0x40;
public const int FOF_NOCONFIRMATION = 0x10; // Don't prompt the user

এবং এটি একটি ফাইল মুছে ফেলার জন্য, এটি রিসাইকেল বিনকে প্রেরণে ব্যবহার করতে, আপনি এর মতো কিছু চান:

var shf = new SHFILEOPSTRUCT();
shf.wFunc = FO_DELETE;
shf.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
shf.pFrom = @"C:\test.txt";
SHFileOperation(ref shf);

4
এবং ডাবল নাল স্ট্রিমেট শেষ।
শান ই

4
SHFileOperation দীর্ঘ পাথ পরিচালনা করে না এবং MAX_PATH (এমনকি একটি \\? F উপসর্গ দিয়েও) এর চেয়ে দীর্ঘ পাথগুলিতে ব্যর্থ হবে।
মেলভিন

মনে রাখবেন যে এই লাইনটি shf.pFrom = @"C:\test.txt";ভুল - পিফর্মটি অবশ্যই ডাবল নাল সমাপ্ত হতে হবে। \0আপনার ফাইলটি যুক্ত করা উচিত shf.pFrom = "C:\\text.txt\0";ডকস.মাইক্রোসফট.এইনস
উইন্ডোস /


1

এর জন্য অন্তর্নির্মিত গ্রন্থাগার রয়েছে

প্রথমে রেফারেন্স যুক্ত করুন মাইক্রোসফ্ট.ভিজুয়ালবাসিক তারপর এই কোডটি যুক্ত করুন:

FileSystem.DeleteFile(path_of_the_file,
                        Microsoft.VisualBasic.FileIO.UIOption.AllDialogs,
                        Microsoft.VisualBasic.FileIO.RecycleOption.SendToRecycleBin,
                        Microsoft.VisualBasic.FileIO.UICancelOption.ThrowException);

আমি এটি এখানে পেয়েছি ।


1

আমি এই এক্সটেনশন পদ্ধতিটি ব্যবহার করি, তারপরে আমি কেবল একটি ডিরেক্টরীআইএনফো বা ফাইলআইএনফো ব্যবহার করতে পারি এবং এটি মুছতে পারি।

public static class NativeMethods
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct SHFILEOPSTRUCT
    {
        public IntPtr hwnd;
        [MarshalAs(UnmanagedType.U4)]
        public int wFunc;
        public string pFrom;
        public string pTo;
        public short fFlags;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        public string lpszProgressTitle;
    }
    private const int FO_DELETE = 0x0003;
    private const int FOF_ALLOWUNDO = 0x0040;           // Preserve undo information, if possible. 
    private const int FOF_NOCONFIRMATION = 0x0010;      // Show no confirmation dialog box to the user      


    [DllImport("shell32.dll", CharSet = CharSet.Auto)]
    static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);

    static bool DeleteFileOrFolder(string path)
    {


        SHFILEOPSTRUCT fileop = new SHFILEOPSTRUCT();
        fileop.wFunc = FO_DELETE;
        fileop.pFrom = path + '\0' + '\0';            
        fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;


        var rc= SHFileOperation(ref fileop);
        return rc==0;
    }

    public static bool ToRecycleBin(this DirectoryInfo dir)
    {
        dir?.Refresh();
        if(dir is null || !dir.Exists)
        {
            return false;
        }
        else
            return DeleteFileOrFolder(dir.FullName);
    }
    public static bool ToRecycleBin(this FileInfo file)
    {
        file?.Refresh();

        if(file is null ||!file.Exists)
        {
            return false;
        }
        return DeleteFileOrFolder(file.FullName);
    }
}

কীভাবে এটি কল করা যায় তার একটি নমুনা এটি হতে পারে:

private void BtnDelete_Click(object sender, EventArgs e)
{
    if(MessageBox.Show("Are you sure you would like to delete this directory?", "Delete & Close", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
        return;

    var dir= new DirectoryInfo(directoryName);
    dir.ToRecycleBin();

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.