एक्सप्लोरर में एक फ़ोल्डर खोलना और एक फ़ाइल का चयन करना


150

मैं चयनित फ़ाइल के साथ एक्सप्लोरर में एक फ़ोल्डर खोलने की कोशिश कर रहा हूं।

निम्नलिखित कोड अपवाद नहीं मिला एक फ़ाइल पैदा करता है:

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

C # में निष्पादित करने के लिए मुझे यह आदेश कैसे मिल सकता है?

जवाबों:


51

इस विधि का उपयोग करें :

Process.Start(String, String)

पहला तर्क एक एप्लिकेशन (एक्सप्लोरर। Exe) है, दूसरा तरीका तर्क आपके द्वारा चलाए गए एप्लिकेशन के तर्क हैं।

उदाहरण के लिए:

CMD में:

explorer.exe -p

C # में:

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
यह मेरे लिए महत्वपूर्ण था :) यह केवल निर्देशिका खोला लेकिन साथ ही :) धन्यवाद संबंध विशेष फ़ाइल चयनित नहीं
InfantPro'Aravind '

2
यह एक आकर्षण की तरह काम करता है लेकिन किसी भी आइडिया को हम कई फाइलों के लिए कैसे कर सकते हैं?
पंकज

7
यदि मेरा फ़ाइल पथ आगे की स्लैश का उपयोग करता है तो छोटे नोट, फ़ाइल पथ के साथ / चयन तर्क मेरे लिए काम नहीं करता है। इसलिए मुझे filePath = filePath.Replace ('/', '\\') करना होगा;
विक्टर चेलारू

6
जैसा कि कहीं और उल्लेख किया गया है, आपका मार्ग उद्धरणों में समाहित होना चाहिए - यह निर्देशिका या फ़ाइल नामों के साथ समस्याओं को रोकता है जिसमें अल्पविराम होते हैं।
कागनार

4
मैं इस मुद्दे पर जूझ रहा था कभी-कभी उपरोक्त दृष्टिकोण काम नहीं करता था क्योंकि फ़ाइल में अल्पविराम होता है। अगर मैंने कगनार की टिप्पणी पढ़ी होती, तो इससे मुझे एक घंटे का काम बच जाता। मैं सैमुअल यांग को उपरोक्त कोड को संशोधित करने का आग्रह करता हूं: स्ट्रिंग तर्क = @ "/ चयन" + "\" "+ फ़ाइलपट +" \ ""
वेन लो

34

यदि आपके पथ में अल्पविराम है, तो Process.Start (ProcessStartInfo) का उपयोग करते समय पथ के चारों ओर उद्धरण डालना काम करेगा।

हालाँकि, यह Process.Start (string, string) का उपयोग करते समय काम नहीं करेगा। ऐसा लगता है कि Process.Start (string, string) वास्तव में आपके 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);

यह स्वीकृत उत्तर होना चाहिए। इसमें विभिन्न संभावित विफलताओं (अधिकारों का मुद्दा, गलत रास्ता, आदि) के लिए एक उचित अपवाद से निपटने की कमी है
२५'१५ को १२:४५

यह सही उत्तर है, स्वीकृत उत्तर काम नहीं करता है, यांग का उत्तर भी काम नहीं करता है।
वीके

31

बस मेरे 2 सेंट के मूल्य, अगर आपके फ़ाइल नाम में रिक्त स्थान हैं, अर्थात "c: \ My फ़ाइल में Spaces.txt" है, तो आपको उद्धरण के साथ फ़ाइलनाम को घेरना होगा अन्यथा एक्सप्लोरर यह मान लेगा कि othe शब्द अलग तर्क हैं ...

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

4
वास्तव में, नहीं, तुम नहीं। @ शमूएल यांग का उदाहरण रिक्त स्थान के साथ काम करता है (परीक्षण किया गया Win7)
कोर्टनी क्रिस्टेंसन

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

इससे मुझे एक फ़ोल्डर को फिर से उपयोग करने में मदद मिली। Process.Start ("explorer.exe", "/ select xxx") हर बार एक नया फ़ोल्डर खोलता है!
मितकिन

यह इस तरह से किया जाना चाहिए, मैं sfgao के लिए एक ध्वज भी बनाऊंगा, और उस enum को uint के बजाय पास
करूंगा

यह एक छोटी सी समस्या के साथ काम करता है; पहली बार फ़ोल्डर खुला है यह हाइलाइट नहीं किया गया है। मैं इसे एक बटन क्लिक विधि के अंदर कहता हूं, और एक बार फ़ोल्डर खुलने के बाद अगर मैं फिर से बटन पर क्लिक करता हूं, तो यह चयनित फ़ाइल / फ़ोल्डर को हाइलाइट करता है। क्या समस्या हो सकती है?
साच

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

फ़ाइल को नहीं ढूंढने का सबसे संभावित कारण वह पथ है जिसमें रिक्त स्थान हैं। उदाहरण के लिए, उसे "एक्सप्लोरर / चयन, c: \ space space \ space.txt" नहीं मिलेगा।

पथ से पहले और बाद में दोहरे उद्धरण जोड़ें, जैसे;

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

या C # के साथ भी ऐसा ही करें

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

1

यह एक हद तक हो सकता है, लेकिन मुझे विश्वास है कि इस तरह के कार्य करना पसंद करते हैं:

    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;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.