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 all1 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.