Usuń rozszerzenie pliku z ciągu nazwy pliku


201

Jeśli mam ciąg mówiący "abc.txt", czy istnieje szybki sposób, aby uzyskać podłańcuch, który jest po prostu "abc"?

Nie mogę zrobić, fileName.IndexOf('.')ponieważ nazwa pliku może być "abc.123.txt"lub coś i oczywiście chcę po prostu pozbyć się rozszerzenia (tj "abc.123".).

Odpowiedzi:


372

Ta Path.GetFileNameWithoutExtensionmetoda podaje plik, który przekazujesz jako argument bez rozszerzenia, co powinno wynikać z nazwy.


1
Miałem zasugerować: string.Format ("{0} \\ {1}", Path.GetDirectoryName (ścieżka), Path.GetFileNameWithoutExtension (ścieżka)) ... ale widziałem jeszcze lepszą wersję poniżej za pomocą Path.Combine zamiast String.Format!
emery.noel

4
Zachowanie ścieżki nie jest pożądanym efektem, zwróć uwagę, że nazwa metody to GetFileNameWithoutExtension. Jeśli obiecano zachowanie ścieżki, nazwa metody powinna być inna. Opis metody jest również dość specyficzny, zwracana jest tylko nazwa pliku bez rozszerzenia. OP nie określa, że ​​wymaga ścieżki. Wręcz przeciwnie.
Morten Bork,

@dukevin nic w tym pytaniu nie ma nic wspólnego ze ścieżką. Po prostu prosi o usunięcie rozszerzenia z nazwy pliku .
Rory McCrossan

248

W tym celu w ramach jest metoda, która zachowa pełną ścieżkę oprócz rozszerzenia.

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

Jeśli potrzebna jest tylko nazwa pliku, użyj

System.IO.Path.GetFileNameWithoutExtension(path);

37
To jest poprawna odpowiedź. Zaakceptowana odpowiedź usuwa ścieżkę pliku
cytryna

8
To lepsza odpowiedź, ponieważ zachowuje ścieżkę
James H

8
nullMa tutaj wartość magiczną. Jeśli użyjesz String.Emptyaka "", pozostanie ci .kropka [ ].
THBBFT

Nie zgadzam się, że ta odpowiedź jest lepsza. GetFileNameWithoutExtensionjest bardziej wyraźny. Chociaż miło jest wiedzieć o jego potencjalnie niepożądanym skutku ubocznym i istnieniu alternatywy, aby go uniknąć.
jeromej

57

Możesz użyć

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

A następnie ręcznie usuń rozszerzenie:

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

@Bio, właściwie to dostaje długość rozszerzenia, a następnie pobiera nazwę pliku aż do rozszerzenia.
Neville,

Jeśli zdecydujesz się zignorować funkcjonalność System.IO.Path, nie jest lepsza, jeśli otrzymasz rozszerzenie jako: string extension = nazwa_pliku.Substring (nazwa_pliku.LastIndexOf ('.')); ?
QMaster

27

String.LastIndexOf będzie działać.

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

10
Uważaj na pliki bez rozszerzenia, takie jak foo/bar.cat/cheese!
Cameron

String.LastIndexOfjest niebezpieczne dla osiągnięcia czegoś takiego. W przypadku plików bez rozszerzenia, jak stwierdzono powyżej w @Cameron, wyniki mogą być inne niż oczekiwane. Najbezpieczniejszym sposobem na to jest użycie powyższej odpowiedzi @ Logman.
Shiva

13

Jeśli chcesz utworzyć pełną ścieżkę bez rozszerzenia, możesz zrobić coś takiego:

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

ale szukam prostszego sposobu na zrobienie tego. Czy ktokolwiek ma jakiś pomysł?


8

Użyłem poniżej, mniej kodu

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

Wyjście będzie

C: \ plik


2
A jeśli mój separator katalogu to „/”;)?
Logman,

4
Użyj Path.Combine()zamiast określać "\\".
Broots Waymb,

1

jeśli chcesz użyć operacji typu String, możesz użyć funkcji lastIndexOf (), która wyszukuje ostatnie wystąpienie znaku lub podłańcucha. Java ma wiele funkcji ciągów.


1

Być może nie pytasz interfejsu API UWP. Ale w UWP file.DisplayNameto nazwa bez rozszerzeń. Mam nadzieję, że przydatne dla innych.


0

Wiem, że to stare pytanie i Path.GetFileNameWithoutExtensionjest lepszą, a może czystszą opcją. Ale osobiście dodałem te dwie metody do mojego projektu i chciałem się nimi podzielić. Wymaga to C # 8.0, ponieważ wykorzystuje zakresy i indeksy.

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
To nie odpowiada na pytanie.
Rapptz

1
Dlaczego napisałbyś do tego metodę rozszerzenia? Poza tym bardzo szczególnym przypadkiem String.GetFileExtension () nie ma żadnego sensu. Jednak funkcja jest przenoszona wszędzie i ma oznaczać zachowanie specyficzne dla dowolnego łańcucha. Co nie jest prawdą.

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

Proszę nie tylko kod pocztowy, ale o wiele bardziej pomocne jest wyjaśnienie odpowiedzi obok kodu.
SuperBiasedMan

1
Duża część kodu jest całkowicie nieistotna. Brak wyjaśnienia. To nie jest przydatne.
Palec

Kod jest zbyt specyficzny dla problemu innego niż ten, o którym mowa.
Dominic Bett

-4

To wdrożenie powinno działać.

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

11
Co abc.txt.pdf? :-)
Palec
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.