Process kullanarak bir klasör açın.


148

Diğer konuyu gördüm ve başka bir sorunla karşılaşıyorum. İşlem başlıyor (görev yöneticisinde gördü), ancak klasör ekranımda açılmıyor. Sorun nedir?

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

yolunuzun doğru olduğundan emin misiniz?
Nathan Koop

1
Explorer'ı neden manuel olarak aramak istiyorsunuz? Neden sadece klasörü açmıyoruz, yani UseShellExecute true değerine ve Verb "open" değerine ayarlanmış bir ProcessStartInfo ile Process.Start çağrılsın mı?
OregonGhost

1
Evet, yol olmadan 'explorer.exe' dosyasını açmayı denedim ve çalışmadı.
Daniel

Soru, bir klasörü nasıl açacağımı değil, explorer.exe'yi bir klasörü açmak için nasıl çalıştıracağı için gönderemedim. Ben sadece neden doğrudan kaşif çağırmak istediğinizi bilmek istedim, çünkü bir nedeni olabilir;)
OregonGhost

Buradaki seçenekleri hariç tutmak istiyorum, bu yüzden bu aptalca bir soru olabilir: Bunu mono kullanarak Linux'ta yapmıyorsunuz, değil mi? Windows ortamından mı bahsediyoruz?
Fredrik Mörk

Yanıtlar:


266

" c:\teste" Klasörünün var olduğundan emin misiniz ? Başlamazsa, gezgin bazı varsayılan klasörleri göstererek açılır (benim durumumda "C:\Users\[user name]\Documents ") .

Güncelleme

Aşağıdaki varyasyonları denedim:

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

Bunlardan hiçbiri (iyi, bir istisna atan dışında) bilgisayarınızda çalışmıyorsa, sorunun kodda değil, çevrede olduğunu düşünmüyorum. Bu durumda, aşağıdakilerden birini (veya her ikisini) deneyeceğim:

  • Çalıştır iletişim kutusunu açın, "explorer.exe" girin ve enter tuşuna basın
  • Bir komut istemi açın, "explorer.exe" yazın ve enter tuşuna basın

Eminim, eğer olmasaydı, herhangi bir klasörü aynı şekilde açar mıydı, açmaz mıydı?
Daniel

Peki, o zaman çevre sorunu olabilir .. cmd aracılığıyla explorer.exe açtım ve normal açtım .. Processs.Start hiçbiri 'Process.Start (@ "c: \ does_not_exist"); bir istisna attı
Daniel

1
Bu explorer penceresi zaten açıksa küçük fark: Process.Start(path) pencereyi etkinleştirir (yalnızca görev çubuğunda yanıp sönebilir, öne getirilmeyebilir); explorer.exe+ parametresi her zaman önde yeni bir pencere açar (ancak aynı pencerenin birkaç katı). Yani ikisinin de uyarısı var.
KekuSemau

Process.Start(@"c:\temp")dikkatle kullanılmalıdır. Varsa c:\temp.com, c:\temp.combunun yerine işlev çağrısı açılır . Daha fazla bilgi için forums.iis.net/p/1239773/2144186.aspx adresine bakın.
Lex Li

Veya Process.Start(@"c:\temp")gibi farklı bir klasör açmaya duyarlı olduğunu unutmayın . VS'nin buggy davranışı sergilediği bu konuya bakın . Bundan kaçınarak varyantı veya (daha iyi, IMO) kullanarak her zaman a . Örneğin ,. C:\temp.exeC:\temp.cmdexplorer.exePath.DirectorySeparatorCharProcess.Start(@"C:\temp\")
binki

46

Sadece bütünlük için, tek yapmanız gereken bir klasör açmaksa, bunu kullanın:

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

Path.DirectorySeparatorCharDosya klasörünün açıkça bir klasörü göstermesini sağlamak için DosyaAdı'nın sona erdiğinden emin olun . (@Binki sayesinde.)

Bu çözüm, bir klasör açmak ve bir öğe seçmek için işe yaramaz, çünkü bunun için bir fiil görünmemektedir.


Bu, hem Windows hem de Linux üzerinde Mono kullanan benim için çalışıyor.
Menno Deij - van Rijswijk

1
Bu yöntemi ve C:\teste.exeveya gibi bir klasörü kullanırsanız C:\teste.cmd, Explorer istediğiniz klasör yerine bu klasörü açar. Bundan kaçınmak Path.DirectorySeparatorChariçin yola bir ekleyebilirsiniz . Bkz VS kendisi aynı hatayı yapar nasıl .
binki

@ Scyssion'un "/ select" kullanarak verdiği cevabı verirseniz, kullanabileceğinizi düşünürsünüz Verb = "select", ama kullanamazsınız. Ne olursa olsun, harika bir cevap!
idbrii

1
Bu benim için yukarıdaki çekirdek yanıtın aksine .NET Core 3'te çalışır. Ayar Verb = "open"gerekli değildi. (Windows'ta test edilmiştir, diğer işletim sistemleri farklı olabilir.)
Walt D

Sen den uygulanabilir fiilleri alabilirsiniz .Verbsüzerinde mülkiyet ProcessStartInfo( docs.microsoft.com/en-us/dotnet/api/... )
GaryNg

16

Dosya veya klasörü seçmek istiyorsanız aşağıdakileri kullanabilirsiniz:

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

2
Bir klasörü seçmek yerine açmak için şu şekilde değiştirin /select:/open
SushiGuy

5

Ters eğik çizgilerinizden kaçma ihtiyacını ortadan kaldıran @ simgesini kullanıyorsunuz.

@ İşaretini kaldırın veya \\ yerine \


Hala klasörü açmıyorum .. Sadece işlemi başlatmak @ görev yöneticisi
Daniel

Başka önerim yok, test edip Visual C # express 2008'de çalıştırabildim
Kevin Laity

1
Diyorum ki ... zebralar. Kaşifinizle ilgili bir sorun var, belki virii ya da bir şey ...
R. Martinho Fernandes

4

Çıkış karakteri olmayan dizeler kullanırken çift ters eğik çizgiye ihtiyacınız yoktur:

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

3

Şunlardan birini kullanmalısınız: System.Diagnostics.Process.Start()Aşırı yüklenmelerden . Oldukça basit!

Çalıştırmak istediğiniz işlemin dosya adını ( explorer.exe) yerleştirmezseniz, sistem bu dosyayı geçerli bir klasör yolu olarak algılar ve zaten çalışan Explorer işlemine eklemeye çalışır. Bu durumda, klasör zaten açıksa, Explorer hiçbir şey yapmaz.

İşlemin dosya adını (yaptığınız gibi) yerleştirirseniz, sistem ikinci dizeyi parametre olarak geçirerek işlemin yeni bir örneğini çalıştırmayı dener. Dize geçerli bir klasörse, yeni oluşturulan işlemde açılır, değilse yeni işlem hiçbir şey yapmaz.

Her durumda geçersiz klasör yollarının işlem tarafından nasıl ele alındığını bilmiyorum. System.IO.Directory.Exists()Bunu sağlamak için kullanmak yeterli olmalıdır.


Bir eklemeniz gerektiğini unutmayın Path.DirectorySeparatorChar. Aksi takdirde, aynı ada sahip .cmdveya / .exeveya muhtemelen diğer soneklere sahip bir klasör de varsa, Explorer bu diğer klasöre açılır - veya bunlar aslında yürütülebilir veya komut dosyalarıysa, klasörü istediğiniz gibi açmak yerine çalıştırır.
binki

1

ProcessStartInfo örneği alan yöntemin aşırı yüklenmiş bir sürümünü kullanın ve ProcessWindowStyle özelliğini sizin için çalışan bir değere ayarlayın.


1

İşaret sizin için bunu yaptığında ters eğik çizgiden kaçıyorsunuz.

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

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

Bu kod VS2010 ortamından iyi çalışır ve yerel klasörü düzgün bir şekilde açar, ancak aynı uygulamayı IIS'de barındırır ve açmaya çalışırsanız, kesinlikle başarısız olur.


1

Sadece bu sorunu yaşadım ve nedenini öğrendim. benim neden isnt burada listelenen kimse bu sorunu alır ve bu hiçbiri bunu düzeltmek.

Visual Studio'yu başka bir kullanıcı olarak çalıştırır ve Process.Start'ı kullanmaya çalışırsanız, bu kullanıcı bağlamında çalışır ve ekranınızda görmezsiniz.


0

Garip.

Explorer.exe bulamazsa, bir istisna almalısınız. Klasörü bulamıyorsa, yine de bir klasör açmalıdır (örn. Belgelerim)

Görev yöneticisinde başka bir Explorer kopyası göründüğünü söylüyorsunuz, ancak göremiyorsunuz.

Ekran dışında (yani başka bir monitör) açılması mümkün mü?

Yoksa bunu hiç etkileşimli olmayan bir hizmette yapıyor musunuz?


Yalnızca 1 monitörüm var ve "Görev yöneticisinde başka bir Explorer kopyası göründüğünü söylüyorsunuz, ancak göremiyorsunuz." bu doğru .. Ne demek istediğini bilmiyorum "Yoksa bunu şans eseri interaktif olmayan bir hizmette mi yapıyorsun?"
Daniel

Yazdığınız program normal bir winforms programının aksine (varsayılan olarak tamamen arka planda çalışan) bir hizmet ise. (Bir hizmetin ne olduğunu bilmiyorsanız, bir servis yazmanız pek olası değildir). Görev yöneticisine dönersek, bu gizli kaşif penceresinde 'geç', 'öne getir' veya 'ekranı kapla' seçeneğini belirlerseniz, görünüyor mu?
sgmoore

0

Başlat menünüzden "explorer.exe c: \ teste" komutunu çalıştırdığınızda doğru açılıyor mu? Ne zamandır bunu deniyorsun? Makinem çok fazla işlem olduğunda ve yeni bir işlem açtığımda (set IE diyor) benzer bir davranış görüyorum .. görev yöneticisinde başlıyor ama ön uçta görünmüyor. Yeniden başlatmayı denediniz mi?

Aşağıdaki kod yeni bir explorer örneği açmalıdır

class sample{

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

0

Bunu denediğinizde çalışan birçok uygulamanız var mı? Bazen işimde garip davranışlarla karşılaşıyorum çünkü sistemimde çok fazla pencere açık olduğu için GDI Handles yetersiz kalıyor (uygulamalarımız çok kullanıyor).

Bu olduğunda, bazı GDI tutamaçlarını serbest bırakmak için bir şeyi kapatana kadar pencereler ve bağlam menüleri artık görünmez.

XP ve Vista'daki varsayılan sınır 10000'dir. DevStudio'mun 1500 GDI tanıtıcısına sahip olması nadir değildir, bu nedenle Dev stüdyosunun birkaç kopyası açıksa, bunları oldukça hızlı bir şekilde yiyebilir. Her işlem tarafından kaç tanıtıcı kullanıldığını görmek için TaskManager'a bir sütun ekleyebilirsiniz.

Sınırı artırmak için yapabileceğiniz bir kayıt defteri çimdik ayarı var.

Daha fazla bilgi için bkz. Http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx


0

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

Sadece yolu değiştirin veya string

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.