2011-03-27 11 views
9

Şu anda bir dosyayı kullanıcı tanımlı bir dosyaya kaydetmeyi içeren bir kodla çalışıyorum. Kullanıcı uzantısı olmayan bir dosya adıyla geçerse, kod dosya türüne göre dahili olarak dahili olarak algılanır (dahili olarak depolanır). Can Spaces Bir Dosya Uzantısı İçinde Var mı?

Ancak, kodun içine geçirilen dosya adının bir uzantıya sahip olup olmadığını belirleyen zor bir zaman yaşıyorum. Ben Path.HasExtension(filename) ve Path.GetExtension(filename) kullanıyorum ama garip davranış sergiliyor gibi görünüyor:

=> .EXT uzantısıdır. Bu iyi. Bir uzantıdır.

This Is A File.EXT =>.EXT uzantısıdır. Bu da iyi.

This Is A File. Not An Extension =>. Not An Extension uzantısıdır. Bununla birlikte, bunu uzantısız bir dosya olarak düşünürdüm. Windows bu adı taşıyan bir dosya oluşturduğumda da düşünür (tanınmayan bir uzantıya sahip bir dosya oluşturmak, Windows'un buna EXTENSIONNAME File adını vermesine neden olur; buna karşın, uzantıya sahip olmayan dosyalar yalnızca File olarak adlandırılır). Bu, uzantıdır.

This Is A File.Not An Extension =>.Not An Extension uzantısıdır. Yukarıdaki gibi aynı sorun. Ayrıca, aynı davranışın Path.GetFileNameWithoutExtension(filename)'da da göründüğüne dikkat edin (ör. Son iki örnekte dosya adı olmadan uzantıyı yalnızca This Is A File olarak bildirir).

Yani bundan aldığım şey, .NET ve Windows'un uzantı olarak ne düşündüklerine göre farklılık göstermeleridir.


Soru: bana bu gibi kod uygulamak için sorun olup olmayacağını merak ediyorum:

if(!Path.HasExtension(filename) || Path.GetExtension(filename).Contains(" ")) {...}

o daha düzgün bir uzantısı benim kodun tanımını çekeceği beri Windows'un işleri nasıl ele aldığı doğrultusunda. Yoksa burada kaybolduğum bir şey var mı?

Aradığınız ve bulduğum this slightly similar question, ancak burada bağlı belgeler yalnızca uzantının bir boşluk/dönemle sonlandırılmasının önerilmediğini belirtir - uzantıdaki boşluklar hakkında hiçbir şey söylemezler.

+0

Bir dosya oluşturdum 'Bu bir dosyadır. Windows 7 ve Windows XP'yi kullanan bir Uzantı değil. Dosyayı oluşturmak için masaüstünde, Yeni Metin Belgesini sağ tıklıyorum. Ya da .Net'i kullanarak dosyayı oluşturmaktan mı bahsediyorsunuz? –

+0

@Thomas Bu dosyaları .NET veya Windows 7 ile oluşturabilirim. Benim amacım, Windows'un dosya uzantı olarak ". – NickAldwin

cevap

9

Windows'ta bir dosya adındaki uzantı, yalnızca bir sözleşmedir. GetExtension ve HasExtension yöntemleri, yalnızca dosya adında bir nokta arar ve buna göre davranır. Dosya adında istediğiniz yeri (uzantı dahil) koymak için özgürsünüz.

"Windows da öyle düşünüyor" dediğinizde, Explorer'da gerçekten uzantıları ayrıştırmaya çalışan bazı kodlar var ve yalnızca .NET'ten biraz farklı bir algoritma kullanıyor.

+0

Tamam, cevabınız için teşekkürler. Bir insan bakış açısından bakıldığında, muhtemelen bir boşluk varsa, kullanıcının muhtemelen bir uzantı olduğu anlamına gelmediğini düşünmek mantıklı mıdır? – NickAldwin

+0

Hiç kimsenin, içinde boşluk bulunan uzantıları kullanan bir program oluşturamayacağını kolayca düşünebilirsiniz, böylece uzantıdaki herhangi bir alan uzantı olmaması anlamına gelmelidir. – Gabe

3

Uzantının ne olduğuna dair resmi bir tanım yoktur. Genel kural, son .'dan sonraki her şeyin uzantı olmasıdır.

Ancak, yaygın olarak kullanılan tüm uzantıların BÜYÜK listesini alırsanız, uzantıdaki boşlukların kullanıldığı yalnızca birkaç örnek bulacağınızı düşünüyorum.

Uzatmalarda boşluklara izin vermeyebilirim. Kullanıcının 999/1000 katı uzatma demek istemedi.

Wikipedia on filenames alıntı:

. (DOT): izin verilir, ancak sonuncu olay VMS, MS-DOS ve Windows'da uzantı ayırıcısı olarak yorumlanacaktır. Diğer işletim sistemlerinde, genellikle dosya adının bir parçası olarak kabul edilir ve birden fazla tam durmaya izin verilebilir.

+0

Her iki sorumu da yanıtladığınız için teşekkürler :) – NickAldwin

4

Dosya sisteminin adları nasıl işlediği ve Windows kabuğunun (yani Explorer) dosya adlarını nasıl işlediği, tamamen farklı iki canavarıdır.

Dosya sistemi boşluk, nokta veya başka bir şeyle ilgilenmez - dosya adı yalnızca bir opak dizedir (izin verilen karakterlerde bazı kısıtlamalarla birlikte). İsim/uzantı ayırma sadece bir yapılanma sözleşmesidir. Öte yandan kabuk, bir uzantının ne olduğuyla ilgili kendi yorumunu oluşturmakta özgürdür çünkü amacı dosya bilgilerini saklamak ve almak değil, kullanıcıya daha iyi bir deneyim sunmaktır. O yüzden cevaplar için oraya gitme.

System.IO yöntemlerinin ne işe yaradığına bakmanızı öneririm (çünkü sözleşmenin iyi olması nedeniyle), ancak bunun için iyi bir neden varsa, kodunuzda istediğiniz her şeyi yapabilirsiniz.

İlgili konular