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


150

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

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

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

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

উত্তর:


51

এই পদ্ধতিটি ব্যবহার করুন :

Process.Start(String, String)

প্রথম যুক্তি হ'ল একটি অ্যাপ্লিকেশন (এক্সপ্লোরার এক্সেক্স), দ্বিতীয় পদ্ধতির যুক্তি হ'ল আপনি চালিত অ্যাপ্লিকেশনটির আর্গুমেন্ট।

উদাহরণ স্বরূপ:

সিএমডিতে:

explorer.exe -p

সি # তে:

Process.Start("explorer.exe", "-p")

32
এটি স্যামুয়েল ইয়াংসের উত্তর হিসাবে ফাইলটি নির্বাচন করে না
হেনন

-p ফাইলটি নির্বাচন করার জন্য যথেষ্ট নয়
জেক

327
// 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);

1
এটি আমার জন্য তাৎপর্যপূর্ণ ছিল :) এটি কেবল ডিরেক্টরিটিই
খোলেনি,

2
এটি একটি কবজির মতো কাজ করে তবে কোনও আইডিয়া কীভাবে আমরা একাধিক ফাইলের জন্য এটি করতে পারি?
পঙ্কজ

7
ছোট নোট, ফাইল পথ সহ / নির্বাচন যুক্তিটি আমার পক্ষে কাজ করে না বলে মনে হয় যদি আমার ফাইলপথটি ফরোয়ার্ড স্ল্যাশ ব্যবহার করে। অতএব আমাকে ফাইলপথ = ফাইলপথ করতে হবে epপরিবর্তন ('/', '\\');
ভিক্টর চেলারু

6
অন্য কোথাও উল্লিখিত হিসাবে, আপনার পাথটি উদ্ধৃতিতে থাকা উচিত - এটি ডিরেক্টরি বা ফাইল নামগুলির সাথে কমা থাকতে পারে এমন সমস্যাগুলি প্রতিরোধ করে।
কাগনার

4
আমি ইস্যুতে লড়াই করছিলাম কখনও কখনও উপরোক্ত পদ্ধতির কাজ হয়নি কারণ ফাইলটিতে একটি কমা রয়েছে। আমি যদি কাগনারের মন্তব্য পড়ে থাকি তবে এটি আমার এক ঘন্টা কাজ বাঁচাতে পারত। আমি স্যামুয়েল ইয়াংকে উপরের কোডটি এটিকে সংশোধন করার জন্য অনুরোধ করছি: স্ট্রিং আর্গুমেন্ট = @ "/ নির্বাচন করুন" + "\" "+ ফাইলপ্যাথ +" Way ""
ওয়েন লো

34

যদি আপনার পাথে কমা রয়েছে, তবে প্রসেস.স্টার্ট (প্রসেসস্টার্টআইএনফো) ব্যবহার করার সময় পাথের চারপাশে উদ্ধৃতিগুলি কাজ করবে।

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

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

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);

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
এটিতে

এটি সঠিক উত্তর, গৃহীত উত্তর কার্যকর হয় না, ইয়াংয়ের উত্তরও কার্যকর হয় না।
ভি কে

31

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

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

4
আসলে, না, আপনি না। @ সামুয়েল ইয়াং এর উদাহরণ ফাঁকা জায়গাগুলির সাথে কাজ করে (পরীক্ষিত উইন 7)
কোর্টনি ক্রিস্টেনসেন

8
তবুও আপনার চারপাশে উদ্ধৃতি কেন দেওয়া উচিত তার নীচে ফিল হুস্টউইকের উত্তর পড়ুন
আক্কু

18

স্যামুয়েল ইয়াং উত্তর আমাকে ছিটকে গেল, এখানে আমার 3 সেন্ট মূল্য রয়েছে।

অ্যাড্রিয়ান হুম ঠিক আছে, নিশ্চিত হয়ে নিন যে আপনি নিজের ফাইলের চারপাশে উদ্ধৃতি রেখেছেন। জোরটনি নির্দেশিত হিসাবে এটি স্পেসগুলি পরিচালনা করতে পারে না এর জন্য নয়, কারণ এটি ফাইলের নামগুলিতে কমাগুলি (এবং সম্ভবত অন্যান্য অক্ষরগুলি) পৃথক যুক্তি হিসাবে স্বীকৃতি দেবে। সুতরাং এটি অ্যাড্রিয়ান হামের পরামর্শ অনুসারে দেখা উচিত।

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

1
এবং এটি filePathএতে অন্তর্ভুক্ত নেই তা নিশ্চিত করুন "। এই চরিত্রটি দৃশ্যত উইন্ডোজ সিস্টেমে অবৈধ তবে অন্য সকলের কাছে অনুমোদিত (যেমন, পসিক্সিশ সিস্টেম), সুতরাং আপনার যদি বহনযোগ্যতা চান তবে আপনার আরও আরও কোডের প্রয়োজন।
বিনকি

14

ব্যবহার Process.Startউপর explorer.exeদিয়ে /selectযুক্তি অদ্ভুত শুধুমাত্র পাথ কম 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);
    }
}

এটি আমাকে একটি ফোল্ডার পুনরায় ব্যবহার করতে সহায়তা করেছে। প্রক্রিয়া.স্টার্ট ("এক্সপ্লোরার এক্সেক্স", "/ এক্সএক্সএক্সএক্সএক্সএক্স") প্রতিবার একটি নতুন ফোল্ডার খোলে!
মিটকিন্স

এটি এইভাবেই করা উচিত, আমি এসফগাওয়ের জন্য একটি পতাকাও তৈরি করতাম এবং ইউন্টের পরিবর্তে সেই এনামটি পাস করতাম
এল.ট্রাবাচিন

এটি একটি ছোট সমস্যা সহ যদিও কাজ করে; প্রথমবার ফোল্ডারটি খোলে এটি হাইলাইট করা হয় না। আমি এটিকে একটি বোতাম ক্লিক পদ্ধতিতে কল করি এবং একবার যদি ফোল্ডারটি খোলা হয় তবে আমি আবার বোতামটি ক্লিক করি, তারপরে এটি নির্বাচিত ফাইল / ফোল্ডারটি হাইলাইট করে। কি সমস্যা হতে পারে?
শচ

13

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

লক্ষ্য করুন সেখানে স্থানের পরিবর্তে / পরে কমা থাকা উচিত ..


6

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


5
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)

5

ফাইলটি সন্ধান না করার সর্বাধিক সম্ভাব্য কারণটি হ'ল পথটি ফাঁকা রয়েছে For উদাহরণস্বরূপ, এটি "এক্সপ্লোরার / সিলেক্ট, সি: \ স্পেস স্পেস \ স্পেস। টেক্সট" পাবেন না।

পথের আগে এবং পরে কেবল ডাবল উক্তি যুক্ত করুন;

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

অথবা সি # তে একই করুন

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

1

এটি কিছুটা ওভারকিলের মতো হতে পারে তবে আমি দৃin় বিশ্বাসের ফাংশন পছন্দ করি তাই এটি গ্রহণ করুন:

    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);
    }

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

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