เปิดโฟลเดอร์โดยใช้ Process.Start


148

ฉันเห็นหัวข้ออื่นและฉันมีปัญหาอื่น กระบวนการเริ่มต้น (เห็นที่ตัวจัดการงาน) แต่โฟลเดอร์ไม่เปิดบนหน้าจอของฉัน เกิดอะไรขึ้น

System.Diagnostics.Process.Start("explorer.exe", @"c:\teste");

คุณแน่ใจเส้นทางของคุณถูกต้องหรือไม่
นาธานคูป

1
ทำไมคุณต้องการเรียก Explorer ด้วยตนเอง ทำไมไม่เพียงแค่เปิดโฟลเดอร์เช่นเรียก Process.Start ด้วย ProcessStartInfo ที่มี UseShellExecute ตั้งค่าเป็น true และ Verb ตั้งค่าเป็น "open"
OregonGhost

1
ใช่ฉันพยายามเปิด 'explorer.exe' โดยไม่ใช้พา ธ และไม่ทำงานเช่นกัน
แดเนียล

ฉันไม่ได้โพสต์เพราะคำถามไม่ใช่วิธีการเปิดโฟลเดอร์ แต่จะเรียกใช้ explorer.exe เพื่อเปิดโฟลเดอร์ได้อย่างไร ฉันแค่อยากจะรู้ว่าทำไมคุณต้องการที่จะเรียกนักสำรวจโดยตรงในสถานที่แรกเพราะอาจจะมีเหตุผล;)
OregonGhost

ฉันแค่ต้องการที่จะไม่รวมตัวเลือกที่นี่ดังนั้นนี่อาจเป็นคำถามที่โง่คุณไม่ได้ทำใน Linux โดยใช้โมโนใช่ไหม? เรากำลังพูดถึงสภาพแวดล้อมของ Windows?
Fredrik Mörk

คำตอบ:


266

คุณแน่ใจแล้วว่ามีโฟลเดอร์ " c:\teste" อยู่หรือไม่ หากไม่เป็นเช่นนั้น Explorer จะเปิดขึ้นเพื่อแสดงโฟลเดอร์เริ่มต้นบางส่วน (ในกรณีของฉัน " C:\Users\[user name]\Documents")

ปรับปรุง

ฉันได้ลองรูปแบบต่อไปนี้แล้ว:

// opens the folder in explorer
Process.Start(@"c:\temp");
// opens the folder in explorer
Process.Start("explorer.exe", @"c:\temp");
// throws exception
Process.Start(@"c:\does_not_exist");
// opens explorer, showing some other folder)
Process.Start("explorer.exe", @"c:\does_not_exist");

หากไม่มีสิ่งใด (ดียกเว้นสิ่งที่ส่งข้อยกเว้น) ทำงานบนคอมพิวเตอร์ของคุณฉันไม่คิดว่าปัญหาจะอยู่ในรหัส แต่ในสภาพแวดล้อม หากเป็นกรณีนี้ฉันจะลองทำอย่างใดอย่างหนึ่งต่อไปนี้

  • เปิดกล่องโต้ตอบเรียกใช้ป้อน "explorer.exe" แล้วกด Enter
  • เปิดพรอมต์คำสั่งพิมพ์ "explorer.exe" แล้วกด Enter

ฉันแน่ใจและถ้ามันไม่มีอยู่จะเปิดโฟลเดอร์ใด ๆ ด้วยวิธีเดียวกันหรือไม่?
349 Daniel

ถ้าอย่างนั้นก็อาจเป็นปัญหาสิ่งแวดล้อม .. ฉันเปิด explorer.exe ผ่าน cmd และเปิดตามปกติ .. ProcesssStart ไม่ทำงานยกเว้น 'Process.Start (@ "c: \ does_not_exist");' ที่โยนข้อยกเว้น
แดเนียล

1
ความแตกต่างเล็กน้อยถ้าหน้าต่าง explorer นั้นเปิดอยู่แล้ว: Process.Start(path) เปิดใช้งานหน้าต่าง (อาจกะพริบในทาสก์บาร์เท่านั้นไม่ใช่มาที่ด้านหน้า); explorer.exeพารามิเตอร์ + เปิดหน้าต่างใหม่เสมอที่ด้านหน้า (แต่หลายครั้งในหน้าต่างเดียวกัน) ดังนั้นทั้งสองมีข้อแม้
KekuSemau

Process.Start(@"c:\temp")จะต้องใช้ด้วยความระมัดระวัง หากc:\temp.comมีอยู่แล้วการเรียกใช้ฟังก์ชันจะเปิดc:\temp.comแทน ดูForums.iis.net/p/1239773/2144186.aspxสำหรับรายละเอียดเพิ่มเติม
Lex Li

ทราบว่าProcess.Start(@"c:\temp")เป็นที่ประทับใจกับการเปิดโฟลเดอร์ที่แตกต่างกันเช่นหรือC:\temp.exe C:\temp.cmdดูปัญหานี้ที่ VS ตัวเองแสดงพฤติกรรมรถ คุณสามารถหลีกเลี่ยงปัญหานี้โดยใช้explorer.exeตัวแปรหรือ (ดีกว่า IMO) Path.DirectorySeparatorCharเสมอท้าย ตัวอย่างเช่นProcess.Start(@"C:\temp\").
binki

46

เพื่อความสมบูรณ์ถ้าคุณต้องการเปิดโฟลเดอร์ใช้สิ่งนี้:

System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo() {
    FileName = "C:\\teste\\",
    UseShellExecute = true,
    Verb = "open"
});

ตรวจสอบให้แน่ใจว่า FileName ลงท้ายด้วยPath.DirectorySeparatorCharเพื่อให้ชี้ไปที่โฟลเดอร์อย่างไม่น่าสงสัย (ขอบคุณ @binki)

วิธีนี้จะไม่ทำงานเมื่อเปิดโฟลเดอร์และเลือกรายการเนื่องจากดูเหมือนจะไม่มีคำกริยาสำหรับสิ่งนั้น


สิ่งนี้ใช้ได้กับฉันทั้งใน Windows และ Linux โดยใช้ Mono
Menno Deij - van Rijswijk

1
หากคุณใช้วิธีนี้และโฟลเดอร์เช่นC:\teste.exeหรือC:\teste.cmdมีอยู่ Explorer จะเปิดไปยังโฟลเดอร์อื่นแทนโฟลเดอร์ที่คุณต้องการ เพื่อหลีกเลี่ยงนี้คุณสามารถผนวกPath.DirectorySeparatorCharไปยังเส้นทาง ดูว่า VS ตัวเองทำผิดพลาดแบบเดียวกันได้อย่างไร
binki

ได้รับคำตอบจาก @ Scyssion โดยใช้ "/ select" คุณคิดว่าคุณสามารถใช้Verb = "select"แต่ก็ไม่สามารถทำได้ คำตอบยอดเยี่ยม!
idbrii

1
สิ่งนี้ใช้ได้กับฉันใน. NET Core 3 ซึ่งแตกต่างจากคำตอบที่ได้รับการยอมรับข้างต้น Verb = "open"ไม่จำเป็นต้องตั้งค่า (ทดสอบใน Windows, ระบบปฏิบัติการอื่นอาจแตกต่างกัน)
Walt D

คุณสามารถรับกริยาที่เกี่ยวข้องได้จาก.Verbsคุณสมบัติในวันที่ProcessStartInfo( docs.microsoft.com/en-us/dotnet/api/ ...... )
GaryNg

16

หากคุณต้องการเลือกไฟล์หรือโฟลเดอร์คุณสามารถใช้สิ่งต่อไปนี้:

Process.Start("explorer.exe", "/select, c:\\teste");

2
หากต้องการเปิดโฟลเดอร์แทนที่จะเลือกเพียงเปลี่ยน/selectเป็น/open
SushiGuy

5

คุณกำลังใช้สัญลักษณ์ @ ซึ่งช่วยลดความจำเป็นในการหลบหลีกแบ็กสแลชของคุณ

ลบเครื่องหมาย @ หรือแทนที่ \\ ด้วย \


ยังไม่เปิดโฟลเดอร์ .. เท่านั้นที่จะเริ่มกระบวนการ @ จัดการงาน
แดเนียล

ฉันไม่มีข้อเสนอแนะเพิ่มเติมฉันสามารถทดสอบและทำให้ใช้งานได้ใน Visual C # express 2008
Kevin Laity

1
ฉันจะบอกว่า ... ม้าลาย มีบางอย่างที่ไม่ถูกต้องอยู่กับการสำรวจของคุณอาจจะ virii หรือ someting ...
อาร์มาตินเฟอร์นันเด

4

คุณไม่ต้องการแบ็กสแลชสองครั้งเมื่อใช้สตริงที่ไม่ใช้ค่า Escape

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

3

คุณควรใช้System.Diagnostics.Process.Start()โอเวอร์โหลดอย่างใดอย่างหนึ่ง มันค่อนข้างง่าย!

หากคุณไม่ได้วางชื่อไฟล์ของกระบวนการที่คุณต้องการเรียกใช้ ( explorer.exe) ระบบจะรับรู้ว่าเป็นเส้นทางโฟลเดอร์ที่ถูกต้องและพยายามแนบกับกระบวนการ Explorer ที่รันอยู่ ในกรณีนี้ถ้าโฟลเดอร์เปิดอยู่แล้ว Explorer จะไม่ทำอะไรเลย

หากคุณวางชื่อไฟล์ของกระบวนการ (ตามที่คุณทำ) ระบบจะพยายามเรียกใช้อินสแตนซ์ใหม่ของกระบวนการผ่านสตริงที่สองเป็นพารามิเตอร์ หากสตริงเป็นโฟลเดอร์ที่ถูกต้องสตริงนั้นจะถูกเปิดในกระบวนการที่สร้างขึ้นใหม่หากไม่มีกระบวนการใหม่จะไม่ทำอะไรเลย

ฉันไม่ทราบว่ากระบวนการโฟลเดอร์เส้นทางที่ไม่ถูกต้องได้รับการปฏิบัติอย่างไร การใช้System.IO.Directory.Exists()ควรเพียงพอเพื่อให้มั่นใจว่า


Path.DirectorySeparatorCharอย่าลืมว่าคุณจะต้องผนวก มิฉะนั้นหากโฟลเดอร์ที่มีชื่อเดียวกัน แต่.cmdหรือ.exeหรืออาจมีคำต่อท้ายอื่น ๆ อยู่ Explorer จะเปิดไปยังโฟลเดอร์อื่นนั้น - หรือถ้าเป็นโฟลเดอร์ที่เรียกใช้งานได้จริงหรือสคริปต์โฟลเดอร์จะเรียกใช้แทนการเปิดโฟลเดอร์ตามที่คุณต้องการ
binki

1

ใช้เวอร์ชันที่โอเวอร์โหลดของเมธอดที่รับอินสแตนซ์ ProcessStartInfo และตั้งค่าคุณสมบัติ ProcessWindowStyle เป็นค่าที่เหมาะกับคุณ


1

คุณกำลังหลบหลีกแบ็กสแลชเมื่อเครื่องหมาย at ทำเพื่อคุณ

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

1
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste"); 

รหัสนี้ทำงานได้ดีจากสภาพแวดล้อม VS2010 และเปิดโฟลเดอร์ในเครื่องอย่างถูกต้อง แต่ถ้าคุณโฮสต์แอปพลิเคชันเดียวกันใน IIS และลองเปิดแล้วมันจะล้มเหลวอย่างแน่นอน


1

ฉันเพิ่งมีปัญหานี้และฉันพบว่าทำไม เหตุผลของฉันไม่อยู่ในรายการที่นี่ดังนั้นใครก็ตามที่ได้รับปัญหานี้และไม่สามารถแก้ไขได้

หากคุณเรียกใช้ Visual Studio ในฐานะผู้ใช้รายอื่นและพยายามใช้กระบวนการเริ่มต้นระบบจะทำงานในบริบทผู้ใช้นั้นและคุณจะไม่เห็นมันบนหน้าจอ


0

แปลก.

หากไม่พบ explorer.exe คุณควรได้รับข้อยกเว้น หากไม่พบโฟลเดอร์ก็ควรเปิดบางโฟลเดอร์ (เช่นเอกสารของฉัน)

คุณพูดว่าอีกหนึ่งสำเนาของ Explorer ปรากฏขึ้นใน taskmanager แต่คุณมองไม่เห็น

เป็นไปได้หรือไม่ว่าจะเปิดหน้าจอ (เช่นจอภาพอื่น)?

หรือคุณมีโอกาสทำเช่นนี้ในบริการที่ไม่โต้ตอบหรือไม่?


ฉันมีจอมอนิเตอร์เพียง 1 จอและ "คุณพูดว่าอีกหนึ่งสำเนาของ Explorer ปรากฏใน taskmanager แต่คุณมองไม่เห็น" ถูกต้อง .. ฉันไม่รู้ว่าคุณหมายถึงอะไร "หรือคุณมีโอกาสที่จะทำสิ่งนี้ในบริการที่ไม่มีการโต้ตอบหรือไม่"
349 Daniel

ฉันหมายถึงถ้าโปรแกรมที่คุณกำลังเขียนเป็นบริการ (ซึ่งโดยค่าเริ่มต้นจะทำงานอย่างสมบูรณ์ในพื้นหลัง) เมื่อเทียบกับโปรแกรม Winforms ปกติ (หากคุณไม่ทราบว่าบริการคืออะไรมันไม่น่าเป็นไปได้ที่คุณจะเขียน) กลับไปที่ taskmanager หากคุณเลือก 'เปลี่ยนเป็น', 'นำมาไว้ข้างหน้า' หรือ 'ขยายใหญ่สุด' ในหน้าต่าง explorer ที่ซ่อนอยู่จะปรากฏหรือไม่
sgmoore

0

มันเปิดอย่างถูกต้องเมื่อคุณเรียกใช้ "explorer.exe c: \ teste" จากเมนูเริ่มต้นของคุณหรือไม่ คุณลองมานานเท่าไหร่แล้ว? ฉันเห็นพฤติกรรมที่คล้ายกันเมื่อเครื่องของฉันมีกระบวนการจำนวนมากและเมื่อฉันเปิดกระบวนการใหม่ (ชุดบอกว่า IE) .. มันเริ่มต้นในตัวจัดการงาน แต่ไม่แสดงในส่วนหน้า คุณลองรีสตาร์ทหรือไม่

รหัสต่อไปนี้ควรเปิดอินสแตนซ์ของ explorer ใหม่

class sample{

static void Main()
{
  System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
}
}

0

คุณมีแอปพลิเคชั่นจำนวนมากที่ทำงานอยู่หรือไม่เมื่อคุณลอง ฉันพบพฤติกรรมแปลก ๆ ในที่ทำงานบางครั้งเพราะระบบของฉันไม่มี GDI Handle เนื่องจากมีหน้าต่างเปิดอยู่มากมาย (แอพของเราใช้มาก)

เมื่อสิ่งนี้เกิดขึ้นหน้าต่างและเมนูบริบทจะไม่ปรากฏขึ้นจนกว่าฉันจะปิดบางสิ่งบางอย่างเพื่อเพิ่มการจัดการ GDI

ขีด จำกัด เริ่มต้นใน XP และ Vista คือ 10,000 ไม่ใช่เรื่องแปลกสำหรับ DevStudio ของฉันที่จะมี 1,500 GDI ที่จัดการดังนั้นถ้าคุณมีสำเนาของสตูดิโอ Dev ที่เปิดอยู่สองสามมันสามารถกินมันได้อย่างรวดเร็ว คุณสามารถเพิ่มคอลัมน์ใน TaskManager เพื่อดูจำนวนการใช้งานของแต่ละกระบวนการ

มีการปรับแต่งรีจิสทรีที่คุณสามารถทำได้เพื่อเพิ่มขีด จำกัด

สำหรับข้อมูลเพิ่มเติมดูhttp://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx


0

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

เพียงแค่เปลี่ยนเส้นทางหรือประกาศใน string

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.