Dosya adı dizesinden dosya uzantısını kaldırma


202

Bir dize söyleyerek "abc.txt"varsa, sadece bir alt dize almak için hızlı bir yolu var "abc"mı?

Yapamam fileName.IndexOf('.')çünkü dosya adı "abc.123.txt"ya da bir şey olabilir ve ben sadece uzantıdan kurtulmak istiyorum (yani "abc.123").

Yanıtlar:


373

Path.GetFileNameWithoutExtensionYöntem size adından açık olmalı gibi, uzantısı olmadan bir argüman olarak geçmesi dosya adını verir.


1
Önerecek miydim: string.Format ("{0} \\ {1}", Path.GetDirectoryName (yol), Path.GetFileNameWithoutExtension (yol)) ... ama aşağıda Path.Combine yerine daha iyi bir sürüm gördüm String.Format!
emery.noel

4
Yolu korumak istenen bir efekt değildir, yöntem adının GetFileNameWithoutExtension olduğunu unutmayın. Yolun korunması söz verildiyse, yöntem adının farklı olması gerekirdi. Yöntem açıklaması da oldukça belirgindir, yalnızca uzantısı olmayan dosya adı döndürülür. OP, yola ihtiyacı olduğunu belirtmiyor. Aksine.
Morten Bork

@dukevin Bu soru hakkında hiçbir şey yol ile ilgisi yoktur. Sadece dosya adından uzantının kaldırılmasını ister .
Rory McCrossan

249

Bu amaç çerçevesinde, uzatma haricinde tam yolu koruyacak bir yöntem vardır.

System.IO.Path.ChangeExtension(path, null);

Yalnızca dosya adı gerekiyorsa şunu kullanın:

System.IO.Path.GetFileNameWithoutExtension(path);

37
Bu doğru cevap. Kabul edilen cevap dosya yolunu şeritler
limon

8
Yolu koruduğu için bu daha iyi bir cevaptır
James H

8
nullBurada sihirli değeri vardır. Eğer kullanırsanız String.Emptyaka ""Eğer bir eğik [sol edilecektir .] nokta.
THBBFT

Bu cevabın daha iyi olduğuna katılmıyorum. GetFileNameWithoutExtensiondaha açıktır. Her ne kadar potansiyel olarak istenmeyen yan etkisini ve bundan kaçınmak için bir alternatifin varlığını bilmek güzel olsa da.
jeromej

57

Kullanabilirsiniz

string extension = System.IO.Path.GetExtension(filename);

Ve sonra uzantıyı manuel olarak kaldırın:

string result = filename.Substring(0, filename.Length - extension.Length);

@Bio, aslında bu uzantının uzunluğunu alır ve uzantıya kadar dosya adını alır.
Neville

System.IO.Path işlevini yok saymaya karar verirseniz, uzantıyı şu şekilde alırsanız daha iyi olmaz: string extension = filename.Substring (filename.LastIndexOf ('.')); ?
QMaster

28

String.LastIndexOf çalışır.

string fileName= "abc.123.txt";
int fileExtPos = fileName.LastIndexOf(".");
if (fileExtPos >= 0 )
 fileName= fileName.Substring(0, fileExtPos);

10
Uzantısı olmayan dosyalara dikkat edin foo/bar.cat/cheese!
Cameron

String.LastIndexOfböyle bir şeyi başarmak için tehlikelidir. @Cameron'un yukarıda belirttiği gibi, uzantısı olmayan dosyalar için sonuçlarınız istediğiniz gibi olmayabilir. Bunu yapmanın en güvenli yolu yukarıdaki @ Logman'ın cevabını
Shiva

13

Uzantı olmadan tam yol oluşturmak istiyorsanız, bunun gibi bir şey yapabilirsiniz:

Path.Combine( Path.GetDirectoryName(fullPath), Path.GetFileNameWithoutExtension(fullPath))

ama bunu yapmanın daha basit bir yolunu arıyorum. Herhangi bir fikri olan var mı?


8

Aşağıda, daha az kod kullandım

string fileName = "C:\file.docx";
MessageBox.Show(Path.Combine(Path.GetDirectoryName(fileName),Path.GetFileNameWithoutExtension(fileName)));

Çıktı

C: \ dosya


2
Peki ya dizin ayırıcım '/';) ise?
Logman

4
Belirtmek Path.Combine()yerine kullanın "\\".
Broots Waymb

1

Dize işlemini kullanmak istiyorsanız, bir karakterin veya alt dizenin son oluşumunu arayan lastIndexOf () işlevini kullanabilirsiniz. Java'nın çok sayıda dize işlevi vardır.


1

Belki UWP API'sini sormuyorsunuzdur. Ancak UWP'de file.DisplayNameuzantısız isim var. Umut diğerleri için yararlı.


0

Bunun eski bir soru olduğunu ve Path.GetFileNameWithoutExtensiondaha iyi ve belki de daha temiz bir seçenek olduğunu biliyorum . Ama şahsen bu iki yöntemi projeme ekledim ve paylaşmak istedim. Bu, aralıkları ve dizinleri kullanması nedeniyle C # 8.0 gerektirir.

public static string RemoveExtension(this string file) => ReplaceExtension(file, null);

public static string ReplaceExtension(this string file, string extension)
{
    var split = file.Split('.');

    if (string.IsNullOrEmpty(extension))
        return string.Join(".", split[..^1]);

    split[^1] = extension;

    return string.Join(".", split);
}

-1
    /// <summary>
    /// Get the extension from the given filename
    /// </summary>
    /// <param name="fileName">the given filename ie:abc.123.txt</param>
    /// <returns>the extension ie:txt</returns>
    public static string GetFileExtension(this string fileName)
    {
        string ext = string.Empty;
        int fileExtPos = fileName.LastIndexOf(".", StringComparison.Ordinal);
        if (fileExtPos >= 0)
            ext = fileName.Substring(fileExtPos, fileName.Length - fileExtPos);

        return ext;
    }

2
Bu soruya cevap vermiyor.
Rapptz

1
Neden bunun için bir uzantı yöntemi yazasınız? Bu çok özel durumun yanı sıra, String.GetFileExtension () herhangi bir anlam ifade etmez. Bununla birlikte, işlev her yerde taşınır ve herhangi bir Dizeye özgü davranışı belirtmesi gerekir. Bu durum böyle değil.

-3
        private void btnfilebrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            //dlg.ShowDialog();
            dlg.Filter = "CSV files (*.csv)|*.csv|XML files (*.xml)|*.xml";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string fileName;
                fileName = dlg.FileName;
                string filecopy;
                filecopy = dlg.FileName;
                filecopy = Path.GetFileName(filecopy);
                string strFilename;
                strFilename = filecopy;
                 strFilename = strFilename.Substring(0, strFilename.LastIndexOf('.'));
                //fileName = Path.GetFileName(fileName);             

                txtfilepath.Text = strFilename;

                string filedest = System.IO.Path.GetFullPath(".\\Excels_Read\\'"+txtfilepath.Text+"'.csv");
               // filedest = "C:\\Users\\adm\\Documents\\Visual Studio 2010\\Projects\\ConvertFile\\ConvertFile\\Excels_Read";
                FileInfo file = new FileInfo(fileName);
                file.CopyTo(filedest);
             // File.Copy(fileName, filedest,true);
                MessageBox.Show("Import Done!!!");
            }
        }

Lütfen sadece kod göndermeyin, cevabınızı kodun yanında açıklamak çok daha yararlıdır.
SuperBiasedMan

1
Kodun büyük bir kısmı tamamen önemsizdir. Açıklama eksik. Bu yararlı değil.
Palec

Kod, söz konusu olandan farklı bir soruna çok özel.
Dominic Bett

-4

Bu uygulama çalışmalıdır.

string file = "abc.txt";
string fileNoExtension = file.Replace(".txt", "");

11
Ne olmuş abc.txt.pdf? :-)
Palec
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.