C# Frage zu Sustring.

eightcore

Lt. Commander
🎅Rätsel-Elite ’24
Registriert
Juli 2008
Beiträge
1.676
Guten Abend.

Ich habe einen String, welcher den Pfad und den Namen einer Datei beinhaltet (z.B. "C:\Windows\System32\cmd.exe"


Jetzt brauche ich daraus nur den Dateityp (z.B. .exe). Das Problem ist, dass die Dateitypen eine verschieden hohe Anzahl an Zeichen in Anspruch nehmen können (z.B. ".cs", .jpeg".

Wie bekomme ich aus dem String den Dateityp?


PS: Ich habe 20 Minuten lang herumprobiert und 5 Minuten gegoogled.
 
System.IO.Path.GetExtension()

Sonst x.SubString( x.LastIndexOf( '.' ) + 1 );. Müsstest du aber absichern, falls LastIndexOf -1 wird. Weiß nicht ob .SubString() dann streiken würde.
 
eightcore schrieb:
Guten Abend.

Ich habe einen String, welcher den Pfad und den Namen einer Datei beinhaltet (z.B. "C:\Windows\System32\cmd.exe"


Jetzt brauche ich daraus nur den Dateityp (z.B. .exe). Das Problem ist, dass die Dateitypen eine verschieden hohe Anzahl an Zeichen in Anspruch nehmen können (z.B. ".cs", .jpeg".

Wie bekomme ich aus dem String den Dateityp?


PS: Ich habe 20 Minuten lang herumprobiert und 5 Minuten gegoogled.

Dann hast du defintiv zu wenig Probiert und zu wenig gegoogelt, bzw. das falsche gegoogelt.
 
Vielen Dank!

Und gleich noch ne Frage:

Wie mache ich eine Bedingung mit mehreren Lösungen?

if (File.Exists(OFD.FileName)) && System.IO.Path.GetExtension(OFD.FileName) == ".jpg")

Ich meine das so, dass nebst .jpg auch .png und .gif ausgewählt worden sein kann, sodass der if-Code ausgeführt wird.

Also im Grunde genommen:

System.IO.Path.GetExtension(OFD.FileName) == ".jpg") || System.IO.Path.GetExtension(OFD.FileName) == ".png")


Nur mit weniger Code.
 
Dazu würde ich mir eine Compare-Funktion schreiben. Glaube nicht, dass C# von Haus aus irgendsowas bietet.
Code:
public int Compare( object Compare, object[] CompareObjects )
{
  for( int i = 0; i < CompareObjects.Length; i++ )
    if( CompareObjects[i].Equals( Compare ) )
      return i;
  return -1;
}

if( File.Exists( OFD.Filename ) && Compare( Path.GetExtension( OFD.Filename ).ToLower(), new object[] { '.png', '.jpg', '.gif', '.bmp', ... } ) != -1 )
  DoSomething();
else
  DoSomethingElse();
Könnte man auch mit einem Generic machen. Alternativ könntest du switch() in Verbindung mit if() verwenden.
Code:
if( File.Exists( OFD.Filename ) )
  switch( Path.GetExtension( OFD.Filename ).ToLower() ) // .ToLower() ist manchmal wichtiger als du denkst!
  {
    case '.png':
    case '.jpg':
    case '.gif':
    case '.bmp':
    case ...:
      DoSomething();
      break;
    default:
      DoSomethingElse();
      break;
  }
else
  DoSomethingOtherElse();

edit: Mit Generic, der Vollständigkeit halber:
Code:
public int Compare<T>( T Compare, T[] CompareObjects ) where T : IComparable<T>
{
  for( int i = 0; i < CompareObjects.Length; i++ )
    if( CompareObjects[i].CompareTo( Compare ) == 0 )
      return i;
  return -1;
}


if( File.Exists( OFD.Filename ) && Compare<string>( Path.GetExtension( OFD.Filename ).ToLower(), new string[] { '.png', '.jpg', '.gif', '.bmp', ... } ) != -1 )
  DoSomething();
else
  DoSomethingElse();
So wird u.a. sichergestellt, dass du auch nur strings übergibst.
 
Zuletzt bearbeitet:
Wenn du die If Abfrage am kürzesten haben willst, dann würde ich es so machen:

Edit: lol, habe garnicht gemerkt das der über mir das schon hat.

PHP:
static void Main(string[] args)
        {
            if (IsPicture(Console.ReadLine()) == true)
            {
                Console.Write("Datei ist ein Bild!");
            }
            else
            {
                Console.Write("Datei ist kein Bild!");
            }
        }

        private static bool IsPicture(string FilePath)
        {
            string Endung = Path.GetExtension(FilePath);

            switch (Endung.ToLower())
            {
                case ".jpg":
                    return true;
                case ".bmp":
                    return true;
                case ".png":
                    return true;
                case ".gif":
                    return true;
                default:
                    return false;
            }
        }
 
Zuletzt bearbeitet:
Auch noch eine Möglichkeit.

Wollte nur anmerken dass Path.GetExtension() auch null zurück geben kann, womit du dann beim .ToLower() ne Exception wirfst. Allerdings prüfst du vorher ob der File existiert von daher sollte es an dieser Stelle keine Probs geben. Da ne zusätzliche Prüfung einzubaun schadet aber trotzdem nicht ;)
Code:
            if (File.Exists(OFD.FileName) && new List<string> { ".jpg", ".png", ".bmp" }.Contains(Path.GetExtension(OFD.Path).ToLower()))
            {

            }
 
Zurück
Oben