Uzantısız dosya adları alma


279

Belirli bir klasördeki dosya adlarını alırken:

DirectoryInfo di = new DirectoryInfo(currentDirName);
FileInfo[] smFiles = di.GetFiles("*.txt");
foreach (FileInfo fi in smFiles)
{
    builder.Append(fi.Name);
    builder.Append(", ");
    ...
}

fi.NameBana onun uzantılı bir dosya adı verir: file1.txt, file2.txt, file3.txt.

Uzantısız dosya adlarını nasıl alabilirim? ( file1, file2, file3)

Yanıtlar:


479

Şunları kullanabilirsiniz Path.GetFileNameWithoutExtension:

foreach (FileInfo fi in smFiles)
{
    builder.Append(Path.GetFileNameWithoutExtension(fi.Name));
    builder.Append(", ");
}

Şaşırmış olsam da, bunu doğrudan almak için bir yol yok FileInfo(ya da en azından göremiyorum).


7
Ve uzantıyı almak için (örneğin daha sonra eklemek için) şunu kullanın: Path.GetExtension (fileName);
Justin

2
@Juzzz Çıplak bir dize ile çalışıyorsanız, ancak zaten bir FileInfo nesneniz varsa, Path ile uğraşmanıza gerek yoktur. FileInfo zaten bu amaçla "Extension" özelliğini sağlar.
jmbpiano

"Mevcut bağlamda" oluşturucu "yok" hatasını aldım. 'System.Text' i ekledim ama yine de aynı hatayı aldım. Sebebi nedir?
ffttyy

@ffttyy , OP kodunda builderbir örnek olacaktır StringBuilder. Bu sadece GetFileNameWithoutExtension için örnek bir kullanımdır - büyük olasılıkla onu çağıran kendi kodunuzu yazmanız daha iyi olacaktır.
Rup

9
Burada dikkat edilmesi gereken bir nokta, dosyanızda çift bir uzantı varsa, GetFileNameWithoutExtensionyalnızca son uzantıyı kaldırmasıdır . Örneğin, dosya adı example.es6.jsolacakexample.es6
David Roberts


22

Bu çözüm aynı zamanda bir virgül eklenmesini de önler.

var filenames = String.Join(
                    ", ",
                    Directory.GetFiles(@"c:\", "*.txt")
                       .Select(filename => 
                           Path.GetFileNameWithoutExtension(filename)));

Bu senaryo için DirectoryInfo, FileInfo sevmiyorum.

DirectoryInfo ve FileInfo klasör ve dosyalar hakkında gerekenden daha fazla veri toplar, böylece gerektiğinden daha fazla zaman ve bellek alırlar.


2
+1. Ben de tercih Directory.GetFilesüzerinde DirectoryInfo.GetFilestek istediğim dosya adları ise, anyday.
Yogesh

String.Join, LINQ, hiçbir StringBuilder çünkü bunu seviyorum.
Csaba Toth

Kaynak koduna bakarsanız. FileInfo'nun yapıcısı çok hafiftir. Ve gördüğünüz tüm bilgiler özellikler yoluyla yapılır. Yalnızca onları aradığınızda toplanırlar
fjch1997

@ fjch1997 - Yapıcı Path.GetFileName öğesini çağırır ve izinleri denetler. Bu biraz gereksiz görünüyor.
Erno

@ErnodeWeerd FileIOPermission, ACL'ye karşı izni kontrol etmez. bunun yerine .NET'te kısmen güvenilen kodun iznini kontrol etmek için bir tür mekanizmadır. Yani, gerçek bir IO çağrısı yapmamalıdır. Performansı ne kadar etkiler? test yapmadan söyleyemem. Ama o kadar da büyük olmadığını varsayalım
fjch1997 19:17

10

Kullanın Path.GetFileNameWithoutExtension. Yol System.IO ad alanındadır.



6

Ek bir yanıt olarak (veya mevcut yanıtları birleştirmek için) bunu sizin için DirectoryInfo sınıfı içinde gerçekleştirmek için bir uzantı yöntemi yazabilirsiniz. İşte oldukça hızlı yazdım, dizin adları veya değişiklik için diğer kriterler, vb sağlamak için süslenebilir bir örnek:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace DocumentDistributor.Library
{
    public static class myExtensions
    {
        public static string[] GetFileNamesWithoutFileExtensions(this DirectoryInfo di)
        {
            FileInfo[] fi = di.GetFiles();
            List<string> returnValue = new List<string>();

            for (int i = 0; i < fi.Length; i++)
            {
                returnValue.Add(Path.GetFileNameWithoutExtension(fi[i].FullName)); 
            }

            return returnValue.ToArray<string>();
         }
    }
}

Düzenleme: Ben de dizinin yapımını elde etmek için LINQ kullanılan bu yöntem muhtemelen basitleştirilmiş veya awesome-ified olabilir düşünüyorum, ama LINQ bu tür bir örnek için yeterince hızlı yapmak için deneyimim yok.

Edit 2 (neredeyse 4 yıl sonra): İşte kullanacağım LINQ ified yöntemi:

public static class myExtensions
{
    public static IEnumerable<string> GetFileNamesWithoutExtensions(this DirectoryInfo di)
    {
        return di.GetFiles()
            .Select(x => Path.GetFileNameWithoutExtension(x.FullName));
    }
}

5

FileInfo kendi uzantısını bilir, böylece onu kaldırabilirsiniz

fileInfo.Name.Replace(fileInfo.Extension, "");
fileInfo.FullName.Replace(fileInfo.Extension, "");

veya paranoyaksanız, ortada görünebilir veya mikrooptimize etmek istiyorsanız:

file.Name.Substring(0, file.Name.Length - file.Extension.Length)

4

dosya adı dizin içeriyorsa ve dizini kaybetmeniz gerekmiyorsa:

fileName.Remove(fileName.LastIndexOf("."))

2

bunu dene,

string FileNameAndExtension =  "bılah bılah.pdf";
string FileName = FileNameAndExtension.Split('.')[0];

1

Sadece kayıt için:

DirectoryInfo di = new DirectoryInfo(currentDirName);
FileInfo[] smFiles = di.GetFiles("*.txt");
string fileNames = String.Join(", ", smFiles.Select<FileInfo, string>(fi => Path.GetFileNameWithoutExtension(fi.FullName)));

Bu şekilde kullanmazsın StringBuilderama String.Join(). Ayrıca , diğer yanıtlardan birinde gördüğüm gibi değil, Path.GetFileNameWithoutExtension()tam bir yola ( fi.FullName) ihtiyaç duyduğunu da belirtin fi.Name.


-5
using System;

using System.IO;

public class GetwithoutExtension
{

    public static void Main()
    {
        //D:Dir dhould exists in ur system
        DirectoryInfo dir1 = new DirectoryInfo(@"D:Dir");
        FileInfo [] files = dir1.GetFiles("*xls", SearchOption.AllDirectories);
        foreach (FileInfo f in files)
        {
            string filename = f.Name.ToString();
            filename= filename.Replace(".xls", "");
            Console.WriteLine(filename);
        }
        Console.ReadKey();

    }

}

5
Bunu sizin için zaten yapan bir Framework sınıfı olduğunu bilmiyorsunuz.
Andrew Barber

3
Ayrıca, birisi "Current.XLSFiles.xls" dosyalarını adlandırırsa, bu GERÇEK sorunlara neden olacaktır.
Tom Padilla

@TomPadilla bu neden sorunlara neden olur?
Luke101

Çünkü bu yöntem dosya adı olarak "Current.files" ifadesini sunar. Çünkü her ".xls" örneği, adın ortasındakiler de dahil olmak üzere "" ile değiştirilir.
Tom Padilla
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.