Login Register
Frontpage Code library Pastebin

CleanPath() - selkeyttää hakemistopolun

Author: Jare
Added: 13. helmikuuta 2021 kello 1.48
Edited: 13. helmikuuta 2021 kello 1.48
Category: Tiedostot

Description

Alkupaloiksi tämä funktio suitsii hakemistoerottimet kohdalleen: / muutetaan \-merkiksi Windows-tyylin mukaisesti, ja tupla \\ -merkit siivotaan niin että niitä on vain yksi. Seuraavaksi käydään yläkansioviittausten kimppuun, eli tutummin: .. -viittaukset sievennetään näin: "C:\joku\kansio\jossain\..\..\joku-tiedosto.txt" muuttuu muotoon "C:\joku\joku-tiedosto.txt". Polun ei ole pakko olla absoluuttinen, käy myös vaikka "kansio/toinen/../jotain.txt", joka muuttuu muotoon "kansio/jotain.txt". Jos ennen ..-merkintää ei esiinny yläkansiota, funktio ei yritä tehdä korvaamista: "../joku.txt" pysyy muodossa "../joku.txt" Funktio ei lue tiedostojärjestelmää millään tavalla. Sitä ei siis kiinnosta, käsitteleekö polku kansiota vai tiedostoa, tai onko se ylipäätään olemassa. Jos polku alkaa ..-merkinnällä, funktio ei ala tarkistamaan, mikä on nykyisen työskentelykansion yläkanio ja palauttamaan sitä, eli mitään kristallipallosta lukemisia ei harrasteta. Jos haluat, että ..-alkuinen polkusi selvitetään absoluuttiseksi poluksi, niin sehän käy helposti: CleanPath(CurrentDir()+"\..\joku-kansio\") Jälkiruoaksi funktio tarjoilee polun valintasi mukaan joko päättyen \-merkkiin tai ilman sitä. Toinen parametri päättää sen. Koodi on aika sekavaa.

Code

Select all
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Does the following cleanups to the given path:
// - Resolves .. in directory paths (if possible)
// - Converts / to \
// - Converts double \\ to \
// The second parameter is used to determine whether you want the path to end with a backslash or not (True/False).
Function CleanPath(path$, end_with_backslash=0)
	path = Replace(path, "/", "\")
	path = Replace(path, "\\", "\")
	
	// Resolve possible ".." folders (= references To parent folders)
	position=1
	While InStr(path, "\..", position)
		position = InStr(path, "\..", position)
		path_start$ = Left(path, position-1) // Contains a trailing folder name that we need To remove later. Does Not contain a trailing backslash.
		path_end$ = Mid(path, position+Len("\..\")) // Might be an empty String
		
		If Right(path_start,2) = ".." Then
			// path_start ends with a ..
			// This means that we have found a ../.. reference.
			// Do Not remove it because we only come here If the ../.. reference was in the beginning of the path.
			position+1
		Else
			// path_start has a regular folder name at the End of it
			// Remove the Last folder from path_start
			For i = Len(path_start) To 1 Step -1
				character$ = Mid(path_start,i,1)
				If character = "\" Then
					path_start = Left(path_start,i) // Will Include a trailing backslash
					Exit
				ElseIf i = 1 Then
					path_start = ""
					Exit
				EndIf
			Next i
			
			// Slice foldername\.. out from middle of path
			path = path_start + path_end
			position = 1 // Make sure to start the Next InStr() check from the beginning
		EndIf
	Wend
	
	If end_with_backslash Then
		If Right(path,1) <> "\" Then path + "\"
	Else
		If Right(path,1) = "\" Then path = Left(path,Len(path)-1) // Remove the backslash
	EndIf
	Return path
EndFunction

Comments

No comments. You can be first!

Leave a comment

You must be logged in to comment.