Xóa phần mở rộng tệp khỏi chuỗi tên tệp


201

Nếu tôi có một chuỗi nói "abc.txt", có cách nào nhanh chóng để có được một chuỗi con chỉ "abc"?

Tôi không thể làm fileName.IndexOf('.')vì tên tệp có thể là "abc.123.txt"một cái gì đó và rõ ràng tôi chỉ muốn thoát khỏi phần mở rộng (tức là "abc.123").

Câu trả lời:


372

Các Path.GetFileNameWithoutExtensionphương pháp mang đến cho bạn tên tập tin bạn vượt qua như một cuộc tranh cãi mà không có phần mở rộng, như nên được rõ ràng từ tên.


1
Sẽ đề xuất: string.Format ("{0} \\ {1}", Path.GetDirectoryName (path), Path.GetFileNameWithoutExtension (path)) ... nhưng tôi đã thấy một phiên bản thậm chí còn tốt hơn bên dưới bằng cách sử dụng Path.Combine thay vì Chuỗi.Format!
emery.noel

4
Giữ nguyên đường dẫn không phải là hiệu ứng mong muốn, lưu ý rằng tên phương thức là GetFileNameWithoutExtension. Nếu bảo toàn đường dẫn đã được hứa, thì tên phương thức sẽ khác. Mô tả phương pháp cũng khá cụ thể, chỉ có tên tệp không có phần mở rộng được trả về. OP không xác định rằng anh ta yêu cầu đường dẫn. Hoàn toàn ngược lại.
Morten Bork

@dukevin không có gì về câu hỏi này có liên quan đến đường dẫn. Nó chỉ đơn giản là yêu cầu loại bỏ phần mở rộng từ tên tệp .
Rory McCrossan

248

Có một phương pháp trong khung cho mục đích này, nó sẽ giữ đường dẫn đầy đủ ngoại trừ phần mở rộng.

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

Nếu chỉ cần tên tệp, sử dụng

System.IO.Path.GetFileNameWithoutExtension(path);

37
Đây là câu trả lời chính xác. Đường dẫn tệp câu trả lời được chấp nhận
chanh

8
Đây là một câu trả lời tốt hơn vì nó bảo tồn con đường
James H

8
nullmột giá trị kỳ diệu ở đây. Nếu bạn sử dụng String.Emptyaka, ""bạn sẽ bị bỏ lại dấu .chấm [ ].
THBBFT

Tôi không đồng ý câu trả lời này là tốt hơn. GetFileNameWithoutExtensionrõ ràng hơn. Mặc dù thật tuyệt khi biết về tác dụng phụ không mong muốn của nó và sự tồn tại của một giải pháp thay thế để tránh nó.
jeromej

57

Bạn có thể dùng

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

Và sau đó xóa phần mở rộng bằng tay:

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

@Bio, thực sự có chiều dài của phần mở rộng, và sau đó lấy tên tệp cho đến khi phần mở rộng.
Neville

Nếu bạn quyết định bỏ qua chức năng System.IO.Path sẽ không tốt hơn nếu bạn có phần mở rộng là: string extension = filename.Sub chuỗi (filename.LastIndexOf ('.')); ?
QMaster

27

String.LastIndexOf sẽ hoạt động.

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

10
Xem ra cho các tập tin không có phần mở rộng, như foo/bar.cat/cheese!
Cameron

String.LastIndexOflà nguy hiểm để hoàn thành một cái gì đó như thế này. Đối với các tệp không có phần mở rộng, như @Cameron đã nêu ở trên, kết quả của bạn có thể không như bạn muốn. Cách an toàn nhất để làm điều này là sử dụng câu trả lời của @ Logman ở trên.
Shiva

13

Nếu bạn muốn tạo đường dẫn đầy đủ mà không cần mở rộng, bạn có thể làm một cái gì đó như thế này:

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

nhưng tôi đang tìm cách đơn giản hơn để làm điều đó. Có ai có ý kiến ​​gì không?


8

Tôi đã sử dụng dưới đây, ít mã hơn

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

Đầu ra sẽ là

Tập tin C: \


2
Và nếu dấu tách thư mục của tôi là '/';) thì sao?
Logman

4
Sử dụng Path.Combine()hơn là chỉ định "\\".
Broots Waymb

1

nếu bạn muốn sử dụng hoạt động Chuỗi thì bạn có thể sử dụng hàm lastIndexOf () mà Tìm kiếm cho lần xuất hiện cuối cùng của một ký tự hoặc chuỗi con. Java có nhiều hàm chuỗi.


1

Bạn có thể không hỏi api UWP. Nhưng trong UWP, file.DisplayNamelà tên không có phần mở rộng. Hy vọng hữu ích cho người khác.


0

Tôi biết đó là một câu hỏi cũ và Path.GetFileNameWithoutExtensionlà một lựa chọn tốt hơn và có thể sạch hơn. Nhưng cá nhân tôi đã thêm hai phương pháp này vào dự án của mình và muốn chia sẻ chúng. Điều này đòi hỏi C # 8.0 do nó sử dụng phạm vi và chỉ số.

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
Điều này không trả lời câu hỏi.
Rapptz

1
Tại sao bạn lại viết một phương thức mở rộng cho việc này? Ngoài trường hợp rất cụ thể này, String.GetFileExtension () không có ý nghĩa gì. Tuy nhiên, hàm được mang đi khắp mọi nơi và được cho là biểu thị hành vi cụ thể cho bất kỳ Chuỗi nào. Đó không phải là trường hợp.

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

Xin đừng chỉ đăng mã, sẽ rất hữu ích để giải thích câu trả lời của bạn cùng với mã.
SuperBiasedMan

1
Phần lớn của mã là hoàn toàn không liên quan. Giải thích là mất tích. Điều này không hữu ích.
Palec

Mã này quá cụ thể cho một vấn đề khác với một vấn đề.
Đaminh Bett

-4

Việc thực hiện này nên hoạt động.

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

11
Thế còn abc.txt.pdf? :-)
Palec
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.