Uri path Den angivna sökvägens format stöds inte : System.NotSupportedException

Permalänk

Uri path Den angivna sökvägens format stöds inte : System.NotSupportedException

Jag vill skapa en path som går till en viss mapp och för att göra detta har jag tagit Directory.GetCurrentDirectory() och delat upp sögvägen i segment så jag kan ta bort debug och bin för att ersätta dom med annat.

private void SeperatePath()
{
string path = Directory.GetCurrentDirectory();
Uri uri = new Uri(path);
string[] splitUri = uri.Segments;
int segments = splitUri.Length;
segments -= 2;
string newPath = "";
for (int i = 0; i < segments; i++)
{
newPath += splitUri[i];
}
string[] fileArray = Directory.GetFiles(newPath); //Skapar problemet

//Jag vill få namnet på alla filer i en mapp så jag ladda in dom samtdigt istället för att specifikt ladda in typ image1 så att om jag lägger till ytterligare filer i mappen så behöver jag inte ändra koden.
foreach (string file in fileArray)
{
Debug.WriteLine(file);
}

Debug.WriteLine(path);
Debug.WriteLine(newPath);

innan jag gör något med Uri path så ser den ut såhär:
C:\Users\2019 PC\source\repos\CreateResources\CreateResources\bin\Debug
efteråt ser den ut såhär
/C:/Users/2019%20PC/source/repos/CreateResources/CreateResources/
Jag antar detta är problemet men vet inte hur jag löser det.

ps. nån lust att påminna mig vad för tecken det är för att skriva kod korrekt i en fråga i forumet?

Visa signatur

Så jag kommer ihåg. [code][/code]

Permalänk
Medlem
Skrivet av MaskenLilja:

ps. nån lust att påminna mig vad för tecken det är för att skriva kod korrekt i en fråga i forumet?

[code][/code]

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || MSI Ventus 3x 5080 || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Skrivet av MaskenLilja:

Jag vill skapa en path som går till en viss mapp och för att göra detta har jag tagit Directory.GetCurrentDirectory() och delat upp sögvägen i segment så jag kan ta bort debug och bin för att ersätta dom med annat.

private void SeperatePath()
{
string path = Directory.GetCurrentDirectory();
Uri uri = new Uri(path);
string[] splitUri = uri.Segments;
int segments = splitUri.Length;
segments -= 2;
string newPath = "";
for (int i = 0; i < segments; i++)
{
newPath += splitUri[i];
}
string[] fileArray = Directory.GetFiles(newPath); //Skapar problemet

//Jag vill få namnet på alla filer i en mapp så jag ladda in dom samtdigt istället för att specifikt ladda in typ image1 så att om jag lägger till ytterligare filer i mappen så behöver jag inte ändra koden.
foreach (string file in fileArray)
{
Debug.WriteLine(file);
}

Debug.WriteLine(path);
Debug.WriteLine(newPath);

innan jag gör något med Uri path så ser den ut såhär:
C:\Users\2019 PC\source\repos\CreateResources\CreateResources\bin\Debug
efteråt ser den ut såhär
/C:/Users/2019%20PC/source/repos/CreateResources/CreateResources/
Jag antar detta är problemet men vet inte hur jag löser det.

ps. nån lust att påminna mig vad för tecken det är för att skriva kod korrekt i en fråga i forumet?

Tjo! Jag har dessvärre väldigt svårt för C# pga. dess objektorientering men jag frågade Gemini (gratisversionen) som föreslog följande kod:

private void SeparatePath() { string path = Directory.GetCurrentDirectory(); string[] pathSegments = path.Split('\\'); // Split the path using the backslash character int segments = pathSegments.Length; segments -= 2; // Remove the 'debug' and 'bin' directories string newPath = ""; for (int i = 0; i < segments; i++) { newPath += pathSegments[i] + "\\"; // Append each segment with a backslash } string[] fileArray = Directory.GetFiles(newPath); // Get all files in the newPath directory foreach (string file in fileArray) { Debug.WriteLine(file); } Debug.WriteLine(path); Debug.WriteLine(newPath); }

När du använder Uri-klassen så genomför den URL-teckenkodning genom att ersätta exempelvis mellanslag med %20 vilket i sin tur leder till en icke-fungerande filsökväg. Notera exempelvis hur "2019 PC" blir "2019%20PC" pga. Uri-klassens metoder.

Så någon annan variant av separation av "\" är nog vad du behöver experimentera med.

Mvh,
WKF.

Visa signatur

(V)ulnerabilities
(I)n
(B)asically
(E)verything
Programming

Permalänk
Medlem

Du vill typiskt inte ta bort bin/debug. Du vill snarare hämta filer som ska installeras med programmet från undermappar jämfört med där programmet körs, vilket i debug-läge råkar vara bin/debug.

Filerna som ska installeras med programmet lägger du i undermappar i Visual Studio-projektet och markerar dem som ”Copy to Output”=”Copy if newer”, så kopieras de in till bin/debug vid kompilering. Det är i alla fall så man typiskt gör i vanliga Visual Studio, hur man gör i Code kommer jag inte ihåg.

Sedan använder man System.IO.Path för att slå ihop det man får från Directory.GetCurrentDirectory() med undermappen och filnamnet på filen man vill öppna. Path.Combine() är rätt metod.

(Det finns andra, mindre fragila, sätt att hitta mappen där .exe:n ligger.)

Ovanstående kommer funka även efter att man byggt ett installationsprogram och installerat filerna på logiskt ställe. Eller om man kör Release-bygge i stället, från bin/Release.

Filer som i stället skapas av användaren behandlas på samma sätt, men de sparar man lämpligen i Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) i stället.

Permalänk
Medlem

Ja, använd klasserna och metoderna som @KAD nämnde ovan, för ditt nuvarande exempel, något i stil med:

private void SeparatePath() { DirectoryInfo currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); // Gå upp två nivåer, eller använd nuvarande om någon av parentfoldrarna saknas (är null) string newPath = currentDirectory.Parent?.Parent?.FullName ?? currentDirectory.FullName; Debug.WriteLine(newPath); string[] fileArray = Directory.GetFiles(newPath); foreach (string file in fileArray) { Debug.WriteLine(file); } // Lista en underkatalog newPath = Path.Combine(newPath, "subFolder"); Debug.WriteLine(newPath); if (Path.Exists(newPath)) { fileArray = Directory.GetFiles(newPath); foreach (string file in fileArray) { Debug.WriteLine(file); } } }

Permalänk
Medlem

Tycker Lento har givit ett rätt rimligt förslag sett till hur man gör *det som efterfrågas*...

MEN hela idén att ha ett program som är hårdkodat att ta Current Working Directory (CWD) och gå två nivåer upp för att hitta filerna det ska jobba med är ju ett rätt bisarrt beteende. Dvs det som efterfrågas känns inte alls genomtänkt, åtminstone inte i något slags större perspektiv.

Jag förstår av frågan att det handlar om att TS råkar stå i någon katalog i utvecklingsmiljön när programmet körs... men så är det ju inte sedan i verkligheten. CWD kan ju vara precis vilken katalog som helst i verkligheten.
Det känns som att antingen så skulle programmet leta efter filerna i CWD (som ju är något som användaren iaf direkt styr över på ett tydligt sätt), eller så behöver det ett argument med vilken katalog det ska leta i / en dialog som frågar om katalogen.

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || MSI Ventus 3x 5080 || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av evil penguin:

Jag förstår av frågan att det handlar om att TS råkar stå i någon katalog i utvecklingsmiljön när programmet körs... men så är det ju inte sedan i verkligheten. CWD kan ju vara precis vilken katalog som helst i verkligheten.

Helt korrekt, om man kör Visual Studio så kan relativt enkelt ange working directory, alternativt inparameter till sitt program i Debug / Launch Profile under egenskaper för projektet.

Permalänk
Medlem
Skrivet av evil penguin:

Tycker Lento har givit ett rätt rimligt förslag sett till hur man gör *det som efterfrågas*...

MEN hela idén att ha ett program som är hårdkodat att ta Current Working Directory (CWD) och gå två nivåer upp för att hitta filerna det ska jobba med är ju ett rätt bisarrt beteende. Dvs det som efterfrågas känns inte alls genomtänkt, åtminstone inte i något slags större perspektiv.

Jag förstår av frågan att det handlar om att TS råkar stå i någon katalog i utvecklingsmiljön när programmet körs... men så är det ju inte sedan i verkligheten. CWD kan ju vara precis vilken katalog som helst i verkligheten.
Det känns som att antingen så skulle programmet leta efter filerna i CWD (som ju är något som användaren iaf direkt styr över på ett tydligt sätt), eller så behöver det ett argument med vilken katalog det ska leta i / en dialog som frågar om katalogen.

Skrivet av Lento:

Helt korrekt, om man kör Visual Studio så kan relativt enkelt ange working directory, alternativt inparameter till sitt program i Debug / Launch Profile under egenskaper för projektet.

Mm, det jag ville åt är väl just att just nu så knackar du in kod i programmet som verkar ha som mål att få det att passa med just hur du testkör det i visual studio.... det kan ju vara okej som en tillfällig lösning i början, men i ett större perspektiv är det ju "tvärt om" som är rimligt; att du ställer in visual studio så att testkörning av programmet fungerar så som programmet är tänkt att användas i verkligheten.

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || MSI Ventus 3x 5080 || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304