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".).

tweetypi
źródło

Odpowiedzi:

372

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

R. Martinho Fernandes
źródło
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);
Ran QUAN
źródło
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);
phdesign
źródło
@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);
Andrzej
źródło
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ł?

Logman
źródło
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

Benjym
źródło
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.

Shraddha
źródło
1

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

sudoer
źródło
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);
}
Emiliano Ruiz
źródło
-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;
    }
shmaltzy
źródło
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!!!");
            }
        }
Prashant Chavan
źródło
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", "");
Dominic Bett
źródło
11
Co abc.txt.pdf? :-)
Palec