ลบนามสกุลไฟล์ออกจากสตริงชื่อไฟล์


201

หากฉันมีสตริงที่บอกว่า"abc.txt"มีวิธีที่รวดเร็วในการรับซับสตริงที่เป็นเพียงแค่"abc"?

ฉันไม่สามารถทำได้fileName.IndexOf('.')เพราะชื่อไฟล์อาจเป็น"abc.123.txt"หรืออะไรก็ได้และฉันแค่ต้องการกำจัดส่วนขยาย (เช่น"abc.123")

คำตอบ:


372

Path.GetFileNameWithoutExtensionวิธีช่วยให้คุณมีชื่อไฟล์ที่คุณผ่านเป็นอาร์กิวเมนต์โดยไม่มีส่วนขยายที่เป็นควรจะชัดเจนจากชื่อ


1
เป็นไปได้ที่จะแนะนำ: string.Format ("{0} \\ {1}", Path.GetDirectoryName (เส้นทาง), Path.GetFileNameWithoutExtension (เส้นทาง)) ... แต่ฉันเห็นรุ่นที่ดียิ่งขึ้นด้านล่างโดยใช้ Path.Combine แทน String.Format!
emery.noel

4
การสงวนเส้นทางไม่ใช่เอฟเฟกต์ที่ต้องการโปรดทราบว่าชื่อเมธอดคือ GetFileNameWithoutExtension หากสัญญาการสงวนเส้นทางไว้ชื่อของวิธีการควรแตกต่างกัน คำอธิบายเมธอดนั้นค่อนข้างเจาะจงเฉพาะชื่อไฟล์ที่ไม่มีนามสกุลเท่านั้น OP ไม่ได้ระบุว่าเขาต้องการเส้นทาง ค่อนข้างตรงกันข้าม
มอร์เทนบอร์ก

@dukevin ไม่มีอะไรเกี่ยวกับคำถามนี้มีอะไรจะทำอย่างไรกับเส้นทาง มันก็ถามว่าสำหรับการกำจัดของส่วนขยายจากชื่อไฟล์
Rory McCrossan

248

มีวิธีการในกรอบสำหรับวัตถุประสงค์นี้ซึ่งจะเก็บเส้นทางแบบเต็มยกเว้นส่วนขยาย

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

หากจำเป็นต้องใช้ชื่อไฟล์เท่านั้นให้ใช้

System.IO.Path.GetFileNameWithoutExtension(path);

37
นี่คือคำตอบที่ถูกต้อง คำตอบที่ยอมรับจะตัดเส้นทางของไฟล์
lemon

8
นี่เป็นคำตอบที่ดีกว่าเพราะมันรักษาเส้นทางไว้
James H

8
nullมีค่ามายากลที่นี่ หากคุณใช้String.Emptyaka ""คุณจะเหลือ [ต่อท้าย.จุด]
THBBFT

ฉันไม่เห็นด้วยกับคำตอบนี้ดีกว่า GetFileNameWithoutExtensionชัดเจนยิ่งขึ้น แม้ว่ามันจะเป็นเรื่องดีที่รู้เกี่ยวกับผลข้างเคียงที่อาจไม่พึงประสงค์และการมีอยู่ของทางเลือกอื่นเพื่อหลีกเลี่ยง
jeromej

57

คุณสามารถใช้ได้

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

จากนั้นนำส่วนขยายออกด้วยตนเอง:

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

@Bio อันที่จริงก็คือความยาวของนามสกุลแล้วคว้าชื่อไฟล์จนถึงนามสกุล
เนวิลล์

หากคุณตัดสินใจที่จะเพิกเฉยต่อการทำงานของ System.IO.Path จะไม่ดีกว่าถ้าคุณได้รับนามสกุลเป็น: string extension = filename.Substring (filename.LastIndexOf ('.')); ?
QMaster

27

String.LastIndexOf จะทำงานได้

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

10
ระวังไฟล์ที่ไม่มีนามสกุลเช่นfoo/bar.cat/cheese!
คาเมรอน

String.LastIndexOfอันตรายสำหรับการทำสิ่งนี้ให้สำเร็จ สำหรับไฟล์ที่ไม่มีนามสกุลเนื่องจาก @Cameron ได้ระบุไว้ด้านบนผลลัพธ์ของคุณอาจไม่ใช่สิ่งที่คุณต้องการ วิธีที่ปลอดภัยที่สุดคือใช้คำตอบของ @ Logman ด้านบน
พระอิศวร

13

หากคุณต้องการสร้างเส้นทางแบบเต็มโดยไม่มีส่วนขยายคุณสามารถทำสิ่งนี้:

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

แต่ฉันกำลังมองหาวิธีที่ง่ายกว่าในการทำเช่นนั้น ไม่มีใครมีความคิดใด ๆ


8

ฉันใช้ด้านล่างรหัสน้อย

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

ผลผลิตจะได้

C: \ ไฟล์


2
และถ้าตัวคั่นไดเรกทอรีของฉันคือ '/';)
Logman

4
ใช้มากกว่าที่ระบุPath.Combine() "\\"
Broots Waymb

1

ถ้าคุณต้องการใช้การดำเนินการของ String คุณสามารถใช้ฟังก์ชัน lastIndexOf () ซึ่งค้นหาการเกิดขึ้นครั้งสุดท้ายของอักขระหรือสตริงย่อย Java มีฟังก์ชั่นสตริงมากมาย


1

คุณอาจไม่ได้ถาม UWP API แต่ใน UWP file.DisplayNameเป็นชื่อที่ไม่มีนามสกุล หวังว่ามีประโยชน์สำหรับคนอื่น ๆ


0

ฉันรู้ว่ามันเป็นคำถามเก่าและPath.GetFileNameWithoutExtensionเป็นตัวเลือกที่ดีกว่าและสะอาดกว่า แต่เป็นการส่วนตัวฉันได้เพิ่มสองวิธีนี้ลงในโครงการของฉันและต้องการแบ่งปัน สิ่งนี้ต้องใช้ C # 8.0 เนื่องจากใช้ช่วงและดัชนี

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
สิ่งนี้ไม่ตอบคำถาม
Rapptz

1
ทำไมคุณถึงเขียนวิธีการขยายสำหรับสิ่งนี้? นอกเหนือจากกรณีที่เจาะจงมากนี้ String.GetFileExtension () ไม่สมเหตุสมผลใด ๆ อย่างไรก็ตามฟังก์ชั่นถูกนำไปใช้ทุกที่และมันควรจะแสดงพฤติกรรมที่เฉพาะเจาะจงกับสตริงใด ๆ ซึ่งไม่ใช่กรณี

-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!!!");
            }
        }

โปรดอย่าเพียงแค่โพสต์รหัสมันมีประโยชน์มากกว่าที่จะอธิบายคำตอบของคุณควบคู่ไปกับรหัส
SuperBiasedMan

1
ส่วนใหญ่ของรหัสไม่เกี่ยวข้องอย่างสมบูรณ์ คำอธิบายหายไป สิ่งนี้ไม่มีประโยชน์
Palec

รหัสเฉพาะเกินไปสำหรับปัญหาที่แตกต่างจากหนึ่งในคำถาม
Dominic Bett

-4

การใช้งานนี้ควรใช้งานได้

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

11
เกี่ยวกับabc.txt.pdfอะไร :-)
Palec
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.