{"id":88,"date":"2025-05-15T15:06:05","date_gmt":"2025-05-15T13:06:05","guid":{"rendered":"https:\/\/blog.es-development.de\/?p=88"},"modified":"2025-05-19T20:58:22","modified_gmt":"2025-05-19T18:58:22","slug":"net-und-das-phantom-backslash","status":"publish","type":"post","link":"https:\/\/blog.es-development.de\/?p=88","title":{"rendered":".NET und das Phantom-Backslash"},"content":{"rendered":"\n<p>Ich bin gerade dabei, einige meiner privat geschriebenen Tools f\u00fcr die Ver\u00f6ffentlichung aufzubereiten. Dabei fliegt man zwangsl\u00e4ufig \u00fcber alten Code, der fr\u00fcher \u201ef\u00fcr mich reichte\u201c, heute aber ruhig ein paar Stufen aufger\u00e4umter, robuster und ver\u00f6ffentlichungsw\u00fcrdig sein darf.<\/p>\n\n\n\n<p>Aktuell \u00fcberarbeite ich mein Tool <strong>Serienhelper<\/strong> \u2013 ein kleines, praktisches Helferlein, das Ordnerstrukturen von Serienverzeichnissen durchsucht und die darin enthaltenen Folgen mit Streamingseiten vergleicht. So l\u00e4sst sich automatisch feststellen, ob neue Folgen verf\u00fcgbar sind oder ob man bereits alles hat. Ziel ist es, Serien automatisch aktuell zu halten, ohne sich durch jede Website klicken zu m\u00fcssen.<\/p>\n\n\n\n<p>W\u00e4hrend ich den Code aufr\u00e4ume, bin ich \u00fcber ein Verhalten in .NET gestolpert, das auf den ersten Blick wie ein Bug wirkt \u2013 aber eigentlich eher ein \u00dcberbleibsel aus der DOS-\u00c4ra ist.<\/p>\n\n\n\n<p>Ich wollte einfach nur alle Unterordner eines Netzlaufwerks auflisten, das als <code>A:\\<\/code> eingebunden ist:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>string folderPath = \"A:\";<br>var subFolders = Directory.GetDirectories(folderPath);<br><\/code><\/pre>\n\n\n\n<p>Was ich erwartet habe:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>A:\\Ordnername<br><\/code><\/pre>\n\n\n\n<p>Was ich bekommen habe:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>A:Ordnername<br><\/code><\/pre>\n\n\n\n<p>Kein Backslash. Kein Witz. Nur ein verwirrter Blick.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Was steckt dahinter?<\/h3>\n\n\n\n<p>Windows unterscheidet bei Pfaden mit Laufwerksbuchstaben ganz genau:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Pfad<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td><code>A:<\/code><\/td><td>aktuelles Arbeitsverzeichnis auf Laufwerk A<\/td><\/tr><tr><td><code>A:\\<\/code><\/td><td>Root-Verzeichnis von Laufwerk A<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Wenn man <code>Directory.GetDirectories(\"A:\")<\/code> aufruft, interpretiert .NET das als <strong>relativen Pfad<\/strong> \u2013 bezogen auf das aktuelle Arbeitsverzeichnis auf Laufwerk A. Und deshalb bekommt man Pfade zur\u00fcck wie <code>A:Ordnername<\/code>, also ohne f\u00fchrenden Backslash.<\/p>\n\n\n\n<p>Das wirkt komisch \u2013 ist aber technisch korrekt. Und ehrlich gesagt auch verdammt alt.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Wie man es richtig macht<\/h3>\n\n\n\n<p>Wenn du das Root-Verzeichnis des Netzlaufwerks <code>A:<\/code> meinst (und nicht einen relativen Pfad), dann musst du das auch explizit sagen:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>string folderPath = @\"A:\\\";<br>var subFolders = Directory.GetDirectories(folderPath);<br><\/code><\/pre>\n\n\n\n<p>Dann bekommst du:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>A:\\Ordnername<br><\/code><\/pre>\n\n\n\n<p>Genau wie erwartet.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Fortgeschritten: Das aktuelle Verzeichnis auf einem anderen Laufwerk setzen<\/h3>\n\n\n\n<p>Falls du wirklich <code>\"A:\"<\/code> verwenden willst, kannst du auch gezielt das <strong>aktuelle Arbeitsverzeichnis f\u00fcr Laufwerk A<\/strong> setzen \u2013 denn Windows speichert f\u00fcr jedes Laufwerk ein eigenes \u201eaktuelles Verzeichnis\u201c.<\/p>\n\n\n\n<p>Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>\/\/ Auf das Laufwerk wechseln (damit Windows wei\u00df, worum es geht)<br>Environment.CurrentDirectory = @\"A:\\\";<br><br>\/\/ Dann ein neues Arbeitsverzeichnis auf A: setzen<br>Directory.SetCurrentDirectory(@\"A:\\Ordner\");<br><br>\/\/ Ab jetzt zeigt \"A:\" auf \"A:\\Ordner\"<br>var subFolders = Directory.GetDirectories(\"A:\");<br><\/code><\/pre>\n\n\n\n<p>Das funktioniert genauso auch f\u00fcr <code>C:<\/code>, <code>D:<\/code> usw. \u2013 Windows behandelt jedes Laufwerk isoliert, was das aktuelle Verzeichnis betrifft.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Das war kein Bug \u2013 aber ein sch\u00f6ner Stolperstein. Wer <code>\"A:\"<\/code> statt <code>\"A:\\\"<\/code> schreibt, bekommt zwar g\u00fcltige, aber irref\u00fchrende Ergebnisse. Gerade bei Tools wie meinem Serienhelper, die mit vielen Pfaden und Netzlaufwerken jonglieren, kann ein unscheinbarer Fehler wie dieser schnell zu unerwartetem Verhalten f\u00fchren.<\/p>\n\n\n\n<p><strong>Meine Empfehlung:<\/strong> Verwende immer vollst\u00e4ndige, absolute Pfade mit Backslash. Der eine kleine Strich macht den Unterschied zwischen &#8222;funktioniert sofort&#8220; und &#8222;was zum&#8230;?&#8220;<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">PS: Retro-Charme mit Nebenwirkungen<\/h3>\n\n\n\n<p>Dass Windows und .NET bis heute DOS-Konventionen wie \u201eaktuelles Verzeichnis pro Laufwerk\u201c mit sich rumschleppen, ist irgendwie charmant. Aber auch gef\u00e4hrlich. Wie so vieles, was aus den 80ern kommt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich bin gerade dabei, einige meiner privat geschriebenen Tools f\u00fcr die Ver\u00f6ffentlichung aufzubereiten. Dabei fliegt man zwangsl\u00e4ufig \u00fcber alten Code, der fr\u00fcher \u201ef\u00fcr mich reichte\u201c, heute aber ruhig ein paar Stufen aufger\u00e4umter, robuster und ver\u00f6ffentlichungsw\u00fcrdig sein darf. Aktuell \u00fcberarbeite ich mein Tool Serienhelper \u2013 ein kleines, praktisches Helferlein, das Ordnerstrukturen von Serienverzeichnissen durchsucht und die [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"Ich bin gerade dabei, einige meiner privat geschriebenen Tools f\u00fcr die Ver\u00f6ffentlichung aufzubereiten. Dabei fliegt man zwangsl\u00e4ufig \u00fcber alten Code, der fr\u00fcher \u201ef\u00fcr mich reichte\u201c, heute aber ruhig ein paar Stufen aufger\u00e4umter, robuster\n#NET #CSharp #Code #Coding #Console #Kurios #SerienHelper","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[36,1,35,34],"tags":[9,8,13,11,12,33,6],"class_list":["post-88","post","type-post","status-publish","format-standard","hentry","category-net","category-allgemein","category-c","category-kurios","tag-net","tag-c","tag-code","tag-coding","tag-console","tag-kurios","tag-serienhelper"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>.NET und das Phantom-Backslash - ES-Development<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.es-development.de\/?p=88\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\".NET und das Phantom-Backslash - ES-Development\" \/>\n<meta property=\"og:description\" content=\"Ich bin gerade dabei, einige meiner privat geschriebenen Tools f\u00fcr die Ver\u00f6ffentlichung aufzubereiten. Dabei fliegt man zwangsl\u00e4ufig \u00fcber alten Code, der fr\u00fcher \u201ef\u00fcr mich reichte\u201c, heute aber ruhig ein paar Stufen aufger\u00e4umter, robuster und ver\u00f6ffentlichungsw\u00fcrdig sein darf. Aktuell \u00fcberarbeite ich mein Tool Serienhelper \u2013 ein kleines, praktisches Helferlein, das Ordnerstrukturen von Serienverzeichnissen durchsucht und die [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.es-development.de\/?p=88\" \/>\n<meta property=\"og:site_name\" content=\"ES-Development\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-15T13:06:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-19T18:58:22+00:00\" \/>\n<meta name=\"author\" content=\"ten\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"ten\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"3\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.es-development.de\/?p=88#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.es-development.de\/?p=88\"},\"author\":{\"name\":\"ten\",\"@id\":\"https:\/\/blog.es-development.de\/#\/schema\/person\/ceaebd34d72e0e9bc4c32244afc453b8\"},\"headline\":\".NET und das Phantom-Backslash\",\"datePublished\":\"2025-05-15T13:06:05+00:00\",\"dateModified\":\"2025-05-19T18:58:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.es-development.de\/?p=88\"},\"wordCount\":423,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.es-development.de\/#organization\"},\"keywords\":[\".NET\",\"C#\",\"Code\",\"Coding\",\"Console\",\"Kurios\",\"SerienHelper\"],\"articleSection\":{\"0\":\".NET\",\"2\":\"C#\",\"3\":\"Kurios\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.es-development.de\/?p=88#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.es-development.de\/?p=88\",\"url\":\"https:\/\/blog.es-development.de\/?p=88\",\"name\":\".NET und das Phantom-Backslash - ES-Development\",\"isPartOf\":{\"@id\":\"https:\/\/blog.es-development.de\/#website\"},\"datePublished\":\"2025-05-15T13:06:05+00:00\",\"dateModified\":\"2025-05-19T18:58:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.es-development.de\/?p=88#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.es-development.de\/?p=88\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.es-development.de\/?p=88#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.es-development.de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\".NET und das Phantom-Backslash\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.es-development.de\/#website\",\"url\":\"https:\/\/blog.es-development.de\/\",\"name\":\"ES-Development\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/blog.es-development.de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.es-development.de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.es-development.de\/#organization\",\"name\":\"ES-Development\",\"url\":\"https:\/\/blog.es-development.de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/blog.es-development.de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.es-development.de\/wp-content\/uploads\/2025\/05\/cropped-Website-Logo-3.png\",\"contentUrl\":\"https:\/\/blog.es-development.de\/wp-content\/uploads\/2025\/05\/cropped-Website-Logo-3.png\",\"width\":340,\"height\":94,\"caption\":\"ES-Development\"},\"image\":{\"@id\":\"https:\/\/blog.es-development.de\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.es-development.de\/#\/schema\/person\/ceaebd34d72e0e9bc4c32244afc453b8\",\"name\":\"ten\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/blog.es-development.de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6cfc54d46f3b4b123624e51125e42f62de1b0ac5215b9bfd17ac90382609d984?s=96&d=mm&r=pg\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6cfc54d46f3b4b123624e51125e42f62de1b0ac5215b9bfd17ac90382609d984?s=96&d=mm&r=pg\",\"caption\":\"ten\"},\"sameAs\":[\"https:\/\/blog.es-development.de\"],\"url\":\"https:\/\/blog.es-development.de\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":".NET und das Phantom-Backslash - ES-Development","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.es-development.de\/?p=88","og_locale":"de_DE","og_type":"article","og_title":".NET und das Phantom-Backslash - ES-Development","og_description":"Ich bin gerade dabei, einige meiner privat geschriebenen Tools f\u00fcr die Ver\u00f6ffentlichung aufzubereiten. Dabei fliegt man zwangsl\u00e4ufig \u00fcber alten Code, der fr\u00fcher \u201ef\u00fcr mich reichte\u201c, heute aber ruhig ein paar Stufen aufger\u00e4umter, robuster und ver\u00f6ffentlichungsw\u00fcrdig sein darf. Aktuell \u00fcberarbeite ich mein Tool Serienhelper \u2013 ein kleines, praktisches Helferlein, das Ordnerstrukturen von Serienverzeichnissen durchsucht und die [&hellip;]","og_url":"https:\/\/blog.es-development.de\/?p=88","og_site_name":"ES-Development","article_published_time":"2025-05-15T13:06:05+00:00","article_modified_time":"2025-05-19T18:58:22+00:00","author":"ten","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"ten","Gesch\u00e4tzte Lesezeit":"3\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.es-development.de\/?p=88#article","isPartOf":{"@id":"https:\/\/blog.es-development.de\/?p=88"},"author":{"name":"ten","@id":"https:\/\/blog.es-development.de\/#\/schema\/person\/ceaebd34d72e0e9bc4c32244afc453b8"},"headline":".NET und das Phantom-Backslash","datePublished":"2025-05-15T13:06:05+00:00","dateModified":"2025-05-19T18:58:22+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.es-development.de\/?p=88"},"wordCount":423,"commentCount":0,"publisher":{"@id":"https:\/\/blog.es-development.de\/#organization"},"keywords":[".NET","C#","Code","Coding","Console","Kurios","SerienHelper"],"articleSection":{"0":".NET","2":"C#","3":"Kurios"},"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.es-development.de\/?p=88#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.es-development.de\/?p=88","url":"https:\/\/blog.es-development.de\/?p=88","name":".NET und das Phantom-Backslash - ES-Development","isPartOf":{"@id":"https:\/\/blog.es-development.de\/#website"},"datePublished":"2025-05-15T13:06:05+00:00","dateModified":"2025-05-19T18:58:22+00:00","breadcrumb":{"@id":"https:\/\/blog.es-development.de\/?p=88#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.es-development.de\/?p=88"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.es-development.de\/?p=88#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.es-development.de\/"},{"@type":"ListItem","position":2,"name":".NET und das Phantom-Backslash"}]},{"@type":"WebSite","@id":"https:\/\/blog.es-development.de\/#website","url":"https:\/\/blog.es-development.de\/","name":"ES-Development","description":"","publisher":{"@id":"https:\/\/blog.es-development.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.es-development.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/blog.es-development.de\/#organization","name":"ES-Development","url":"https:\/\/blog.es-development.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/blog.es-development.de\/#\/schema\/logo\/image\/","url":"https:\/\/blog.es-development.de\/wp-content\/uploads\/2025\/05\/cropped-Website-Logo-3.png","contentUrl":"https:\/\/blog.es-development.de\/wp-content\/uploads\/2025\/05\/cropped-Website-Logo-3.png","width":340,"height":94,"caption":"ES-Development"},"image":{"@id":"https:\/\/blog.es-development.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/blog.es-development.de\/#\/schema\/person\/ceaebd34d72e0e9bc4c32244afc453b8","name":"ten","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/blog.es-development.de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6cfc54d46f3b4b123624e51125e42f62de1b0ac5215b9bfd17ac90382609d984?s=96&d=mm&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6cfc54d46f3b4b123624e51125e42f62de1b0ac5215b9bfd17ac90382609d984?s=96&d=mm&r=pg","caption":"ten"},"sameAs":["https:\/\/blog.es-development.de"],"url":"https:\/\/blog.es-development.de\/?author=1"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.es-development.de\/index.php?rest_route=\/wp\/v2\/posts\/88","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.es-development.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.es-development.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.es-development.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.es-development.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=88"}],"version-history":[{"count":5,"href":"https:\/\/blog.es-development.de\/index.php?rest_route=\/wp\/v2\/posts\/88\/revisions"}],"predecessor-version":[{"id":185,"href":"https:\/\/blog.es-development.de\/index.php?rest_route=\/wp\/v2\/posts\/88\/revisions\/185"}],"wp:attachment":[{"href":"https:\/\/blog.es-development.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=88"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.es-development.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=88"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.es-development.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=88"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}