c# রফক এক্সপ্লোরার একটি ফোল্ডার খোলা এবং একটি ফাইল নির্বাচন




মজিলা ফায়ারফক্স উইকিপিডিয়া (9)

আমি নির্বাচিত একটি ফাইল সঙ্গে এক্সপ্লোরার একটি ফোল্ডার খুলতে চেষ্টা করছি।

নিচের কোডটি একটি ফাইল তৈরি করে যা ব্যতিক্রম খুঁজে পাওয়া যায় নি:

System.Diagnostics.Process.Start(
    "explorer.exe /select," 
    + listView1.SelectedItems[0].SubItems[1].Text + "\\" 
    + listView1.SelectedItems[0].Text);

আমি কিভাবে এই কমান্ডটি সি # কার্যকর করতে পারি?


ফাইলটি খুঁজে না পাওয়ার পক্ষে সর্বাধিক সম্ভাব্য কারণটি হল স্পেস থাকার পথ। উদাহরণস্বরূপ, এটি "এক্সপ্লোরার / সিলেক্ট, সি: \ স্পেস স্পেস \ space.txt" খুঁজে পাবে না।

শুধু পথ আগে এবং পরে ডবল উদ্ধৃতি যোগ করুন;

explorer /select,"c:\space space\space.txt"

অথবা সি # সঙ্গে একই কাজ

System.Diagnostics.Process.Start("explorer.exe","/select,\"c:\space space\space.txt\"");

শুধু আমার 2 সেন্টের মূল্য, যদি আপনার ফাইলের নামটিতে স্পেস থাকে, যেমন "c: \ আমার ফাইলটিতে স্পেসস টেকটিউন থাকে", আপনাকে অবশ্যই উদ্ধৃতি দিয়ে ফাইলের নামটি ঘিরে রাখতে হবে নাহলে এক্সপ্লোরারটি অনুমান করবে যে এই শব্দটি আলাদা আলাদা যুক্তি রয়েছে ...

string argument = "/select, \"" + filePath +"\"";

"/Select,c:\file.txt" ব্যবহার করুন

স্থান পরিবর্তনের পরিবর্তে একটি কমা / নির্বাচন হওয়া উচিত তা লক্ষ্য করুন ..


প্রক্রিয়া ব্যবহার করে। explorer.exe /select argument দিয়ে শুরু করুন অদ্ভুতভাবে 120 অক্ষরের চেয়ে কম দীর্ঘ পথের জন্য কাজ করে।

আমি সব ক্ষেত্রে কাজ করার জন্য একটি নেটিভ উইন্ডোজ পদ্ধতি ব্যবহার করতে হয়েছিল:

[DllImport("shell32.dll", SetLastError = true)]
public static extern int SHOpenFolderAndSelectItems(IntPtr pidlFolder, uint cidl, [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, uint dwFlags);

[DllImport("shell32.dll", SetLastError = true)]
public static extern void SHParseDisplayName([MarshalAs(UnmanagedType.LPWStr)] string name, IntPtr bindingContext, [Out] out IntPtr pidl, uint sfgaoIn, [Out] out uint psfgaoOut);

public static void OpenFolderAndSelectItem(string folderPath, string file)
{
    IntPtr nativeFolder;
    uint psfgaoOut;
    SHParseDisplayName(folderPath, IntPtr.Zero, out nativeFolder, 0, out psfgaoOut);

    if (nativeFolder == IntPtr.Zero)
    {
        // Log error, can't find folder
        return;
    }

    IntPtr nativeFile;
    SHParseDisplayName(Path.Combine(folderPath, file), IntPtr.Zero, out nativeFile, 0, out psfgaoOut);

    IntPtr[] fileArray;
    if (nativeFile == IntPtr.Zero)
    {
        // Open the folder without the file selected if we can't find the file
        fileArray = new IntPtr[0];
    }
    else
    {
        fileArray = new IntPtr[] { nativeFile };
    }

    SHOpenFolderAndSelectItems(nativeFolder, (uint)fileArray.Length, fileArray, 0);

    Marshal.FreeCoTaskMem(nativeFolder);
    if (nativeFile != IntPtr.Zero)
    {
        Marshal.FreeCoTaskMem(nativeFile);
    }
}

এটি একটি overkill একটি বিট হতে পারে কিন্তু আমি convinience ফাংশন পছন্দ তাই এই এক নিতে:

    public static void ShowFileInExplorer(FileInfo file) {
        StartProcess("explorer.exe", null, "/select, "+file.FullName.Quote());
    }
    public static Process StartProcess(FileInfo file, params string[] args) => StartProcess(file.FullName, file.DirectoryName, args);
    public static Process StartProcess(string file, string workDir = null, params string[] args) {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.FileName = file;
        proc.Arguments = string.Join(" ", args);
        Logger.Debug(proc.FileName, proc.Arguments); // Replace with your logging function
        if (workDir != null) {
            proc.WorkingDirectory = workDir;
            Logger.Debug("WorkingDirectory:", proc.WorkingDirectory); // Replace with your logging function
        }
        return Process.Start(proc);
    }

এটি হল এক্সটেনশান ফাংশন যা আমি <string> .Quote () হিসাবে ব্যবহার করি:

static class Extensions
{
    public static string Quote(this string text)
    {
        return SurroundWith(text, "\"");
    }
    public static string SurroundWith(this string text, string surrounds)
    {
        return surrounds + text + surrounds;
    }
}

আপনাকে স্টার্ট পদ্ধতির দ্বিতীয় প্যারামিটারে পাস করতে ("/ নির্বাচন ইত্যাদি") আর্গুমেন্টগুলি রাখতে হবে।


যদি আপনার রাস্তাটি কমা থাকে তবে Proc.Start (ProcStartInfo) ব্যবহার করার সময় পথের চারপাশে উদ্ধৃতিগুলি কাজ করবে।

Process.Start (স্ট্রিং, স্ট্রিং) ব্যবহার করার সময় এটি কাজ করবে না। এটা প্রক্রিয়া। স্টার্ট (স্ট্রিং, স্ট্রিং) মত মনে হয় আসলে আপনার args ভিতরে উদ্ধৃতি মুছে ফেলা।

এখানে একটি সহজ উদাহরণ যে আমার জন্য কাজ করে।

string p = @"C:\tmp\this path contains spaces, and,commas\target.txt";
string args = string.Format("/e, /select, \"{0}\"", p);

ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "explorer";
info.Arguments = args;
Process.Start(info);

string windir = Environment.GetEnvironmentVariable("windir");
if (string.IsNullOrEmpty(windir.Trim())) {
    windir = "C:\\Windows\\";
}
if (!windir.EndsWith("\\")) {
    windir += "\\";
}    

FileInfo fileToLocate = null;
fileToLocate = new FileInfo("C:\\Temp\\myfile.txt");

ProcessStartInfo pi = new ProcessStartInfo(windir + "explorer.exe");
pi.Arguments = "/select, \"" + fileToLocate.FullName + "\"";
pi.WindowStyle = ProcessWindowStyle.Normal;
pi.WorkingDirectory = windir;

//Start Process
Process.Start(pi)

// suppose that we have a test.txt at E:\
string filePath = @"E:\test.txt";
if (!File.Exists(filePath))
{
    return;
}

// combine the arguments together
// it doesn't matter if there is a space after ','
string argument = "/select, \"" + filePath +"\"";

System.Diagnostics.Process.Start("explorer.exe", argument);




explorer