2009-06-26 19 views
49

Bir yolu bir dosya adıyla birleştirmenin en iyi yolu nedir?Bir yolu ve bir dosya adını C#/NET'te birleştirmenin en iyi yolu nedir?

c:\foo göz önüne alındığında

ve bar.txt, ben c:\foo\bar.txt istiyorum.

Verilen c:\foo ve ..\bar.txt, bir hata ya da c:\foo\bar.txt ya (yani doğrudan Path.Combine() kullanamazsınız) istiyorum. Benzer şekilde c:\foo ve bar/baz.txt için bir hata veya c:\foo\baz.txt (c:\foo\bar\baz.txt değil) istiyorum.

Dosya adının '\' veya '/' içermediğini kontrol edebilirdim, ama bu yeterli mi? Değilse, doğru kontrol nedir?

cevap

83

sen "kötü" dosya adları istiyorsanız (test edilmedi, belki Path.GetFileName bu otomatik kolları) bir ex atma olmadan sadece sessizce doğru "kötü" dosya istiyorsanız,

if (Path.GetFileName(fileName) != fileName) 
{ 
    throw new Exception("'fileName' is invalid!"); 
} 
string combined = Path.Combine(dir, fileName); 

Veya: bir hata oluşturabilir larına tarafından:

string combined = Path.Combine(dir, Path.GetFileName(fileName)); 
+9

Çerçeveye daha az aşina olanlar için, 'Path''e erişmek için dosyada' System.IO' kullanarak arama yapmalısınız. –

+2

"Path.Combine", argümanlarından biri "null" ise, "ArgumentNullException" ifadesini atar. ** **, boş bir dizgeyi –

+2

numaralı argümana geçirebilir. Not: Path.Combine, gerekirse her yol arasında normalde bir ayırıcı ekleyecektir. Ancak, Path.Combine ("C:", "file.txt"), geçerli bir yol olmayan "C: file.txt" değerini döndürür. – ConditionRacer

16

Sen kullanabilirsiniz: \ dışarı atlamak için,

Path.Combine(folder, Path.GetFileName(fileName)) 

veya

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\"))) 
+4

Teşekkürler! Sadece FYI: Değiştir gerekli değil. –

1

Eğer Path.Combine(arg1, arg2) kullandığınızda farkında olun - Kullanıcı ARG2 için tam olarak nitelenmiş dosya yolunu girer eğer ARG1 gözardı edilirse ve yol olarak arg2 kullanacaktır.

Bana göre, Microsoft burayı mahvetti! Bu, tüm dosya sisteminizi kesen kullanıcıyla sizi çok açık bırakabilir. Dikkatli olun, iyi haberi okuyun! Yolları birleştiriyorsanız kullanın: var newPath = path1 + @"\" + path2; daha basit ve beklenmeyen sonuç yok ...

+0

Göreceli yolların birleştirilmesi sonucunda sağ taraftaki tam yol döndürülen yol doğru ve geçerli bir sonuçtur. –

+1

Doğru ve geçerli bir sonucu olup olmadığına bakılmaksızın, çok fazla dev, kod arg1'inde bir klasör yolu ve arg2'nin kullanıcı girişi olması durumunda, sonuçta çıkan çıktı olarak arg2 girilen bir mutlak yolun eksik olması gerçeğini kaçırır. Bence web app hack kötü ... benim fikrimi açmak için çok kolay hale getirir ... kod/kabuk enjeksiyon ... Giriş adamlarınızı kontrol edin. – Cyassin

+0

Benim düşünceme göre, bir kullanıcının herhangi bir denetimi olmaksızın yollarını yazmasına izin vermenin uygun olmadığını düşündüğü herhangi bir geliştirici - saldırıya uğramayı hak ediyor. Bu Day One şeyler ve Path.Combine sizin düşünün şekilde düşünmek için tasarlanmamıştır - aslında kodunuz tarafından dahili kullanım için tasarlanmış terminal ters eğik çizgi için kontrol etmek zorunda kalmamak için iyi ve sağlam bir yoldur, dosyalarınızı korumak için bir ön uç olarak değil. Bunun için belgeleme oldukça eksiksiz - sadece okuyun. – jinzai

İlgili konular