Mitt problem denna gången är att via kodvägen kunna hitta rätt sökväg för en encludefil t ex. Splitta bägge sökvägarna på / så att du får arrayer med mappar. Sedan loopar du igenom bägge arrayerna av mappar och kollar hur många mappar som är lika. De mappar som är över i källan ersätter du med ../, och sedan lägger du på de mappar som är kvar i destinationen. Jag är väll helt ute och reser antar jag.... Benni, Benni, Hej Andreas, och tack för försöket. Du har rätt med trim, har tagit bort den. Så här blir det: Hej Guffa! Benni, Såg nyss ett par exempel i ditt senaste inlägg som jag missade... För närvarande så använder jag mig av: Prova denna.. definitivt inte snygg, men snyggare än din lösning iaf =) Du kan använda funktionen för att få den logiska sökvägen från vilken mapp som helst till vilken mapp som helst. Andreas Håkansson: Benni, Eh... Du kanske skulle läsa de tidigare inläggen först... ;) Nej, jag har kört på "min" så länge.Dynamisk sökväg
Jag håller på med en app som är till för att kunna fixa vissa asp.sidor. Via kod så lägger jag bl a in include-filer, och då gäller det ju att följa mappstrukturen.
T ex om jag har en fil i roten och skall till "_databas" så blir ju includefilen:
<!--#include file="_databas/dataconn.asp"-->
Ligger jag därimot i t ex KullSaker/Admin/EditNyheter då blir ju sökvägen
<!--#include file="../../_databas/dataconn.asp"-->
Att sen göra det med kod, går jag bet på.
Så här försöker jag:
<code>
public static string changeWebbNameToDot(string webbplats)
{
string nyWebbplats ="";
string ny="";
webbplats=webbplats.Replace("\\","/") + "/";
webbplats=webbplats.Replace("_","");
Regex rr = new Regex("[/]");
MatchCollection st = rr.Matches(webbplats, 0);
int num = st.Count;
if(st.Count>0) //Found *'s
{
if(num>1)
{
ny="../";
}
else
{
ny="";
}
}
nyWebbplats = ny +"_DataBas";
return nyWebbplats;
}
</code>
Som jag har kommit här, så är det ju bara en "nivå" som jag klarar. Visst skulle man kunna göra en massa if-satser eller case, men jag undrar om det inte går att göra det smidigare???Sv: Dynamisk sökväg
Exempel, du ska ha sökvägen ifrån
test/djur/apor/gorillor
till
test/djur/husdjur/katter/siameser
Mapparna test och djur försvinner eftersom de är lika.
Mapparna apor och gorillor resulterar i ../../
Du lägger på de mappar som är kvar i destinationen: ../../husdjur/katter/siameserSv: Dynamisk sökväg
<code>
string [] split = webbplats.Split(new Char [] {'/'});
foreach (string s in split)
{
string Ny="../";
if (s.Trim() != "")
Ny=Ny+Ny;
}
nyWebbplats = ny +"_DataBas";
</code>
Jag tänkte som så, att för varje loop så skulle den lägga ihop ny en gång till, men detta fungerar inte...Sv: Dynamisk sökväg
Titta på vad du gör här
string Ny="../";
if (s.Trim() != "")
Ny=Ny+Ny;
varje gång loopen börjar om så "nollställer" du variablen Ny till "../" använda antingen dig av två olika variabler eller bygg om logiken i rutinen (reglerna).
Ska du inte ha något i stil med
string [] split =
webbplats.Split(new Char [] {'/'});
string shortAdress = "../";
foreach (string s in split)
{
if (s.Trim() != "")
shortAdress += shortAdress;
}
//Andreas
Sv: Dynamisk sökväg
Vid närmare eftertanke så varför använder du dig av s.Trim() ? Den plockar juh bara bort blanksteg före och efter din sträng. Ska du inte göra en jämförlse av kataloger för att kunna avgöra om katalognamnet skall läggas med eller om det skal bli en ../ istället? Nu loopar du igenom hela adressen, kollar om du får en tomsträng när du tagit bort blanksteg och isf lägger du till ytterligare en ../ annars kör du absolut ingenting ?
//AndreasSv: Dynamisk sökväg
Idén har du förstått, men det fungerar inte.
Om vi utgår ifrån roten, webbplats som alltså kan vara "HTML_TEST" då blir resultatet "../../_DataBas
Går jag upp ett steg till "HTML_TEST/Lang" så blir resultatet "../../../../_DataBas"
Det finns något grundfel här som jag inte ser...Sv: Dynamisk sökväg
string relativePath(string source, string destination)
{
char[] slash = {'/'};
string[] src = source.Split(slash);
string[] dest = destination.Split(slash);
string path = "";
int idx;
for (idx = 0; idx<src.Length && idx<dest.Length; idx++) if (src[idx] != dest[idx]) break;
for (int cnt = idx; cnt < src.Length; cnt++) path += "../";
for (int cnt = idx; cnt < dest.Length; cnt++) path += dest[cnt] + "/";
return path;
}
Anropet
relativePath("test/djur/apor/gorillor", "test/djur/husdjur/katter/siameser")
ger resultatet "../../husdjur/katter/siameser/".
Sv: Dynamisk sökväg
Nix, det lyckades inte heller.
Jag förstår inte din tanke korrekt heller.
Tänk dig så här, var än i min mappning jag står, så skall jag nå den mapp som innehåller min connections-fil. Denna mapp heter "_DataBas".
Varför skall jag gämföra, när allt jag behöver veta är hur många slach(/) det finns..
Det innebär ju:
Om jag är i roten, så skall ju resultatet se ut så här
"_DataBas"
Om vi tänker oss att jag har ett forum, och står där, så skall ju resultatet se ut så här:
"../_DataBas"
Om vi tänker oss att det ligger t ex en adminmapp i forumet, så skall ju resultatet se ut så här:
"../../_DataBas"
När det gälde ditt försök så fick jag bara ett resultat : "../_DataBas", oavsett vilken mapp jag var i.
Den sträng som jag matar in är namnet på webbplatsen(vad jag kallar för rotmapp t ex HTML_TEST)
Via en treeview så får jag fram mappstrukturen och en listview lista alla filerna i den aktuella mappen.
Visar då treeview:n att jag står i roten, och klickar på en fil i listview:n, då vill jag ha resultatet ifrån classen till: "_DataBas".
Har jag via treeview:n klickat mig fram till HTML_TEST/Forum då vill jag ha resultatet ifrån classen till: "../_DataBas".
Jag hoppas att jag är tydlig nog???Sv: Dynamisk sökväg
Skulle du kunna lägga in 2st exempel exakt på hur du vill använda funktionen. Dina exempel är lite luddiga så om du kan ge oss 2 st "om jag skickar in A och B så vill jag få ut C" exempel så skulle det underlätta.
//AndreasSv: Dynamisk sökväg
//AndreasSv: Dynamisk sökväg
<code>
public static string changeWebbNameToDot(string webbplats)
{
string nyWebbplats ="";
string ny="";
webbplats=webbplats.Replace("\\","/") + "/";
webbplats=webbplats.Replace("_","");
Regex rr = new Regex("[/]");
MatchCollection st = rr.Matches(webbplats, 0);
int num = st.Count;
if(st.Count>0) //Found *'s
{
if(num==1)
{
ny="";
}
else if(num==2)
{
ny="../";
}
else if(num==3)
{
ny="../../";
}
else if(num==4)
{
ny="../../../";
}
else
{
ny="";
}
}
nyWebbplats = ny;
return nyWebbplats;
}
</code>
Detta fungerar kanon, men är en väldigt ful kod.
Jag utnytjar den t ex i classen som skriver dataconnection
<code>
//****
sw.WriteLine("Connection.Open" + " \"" +"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +"\"" +" & server.MapPath(" + "\"" + dynpath +"_DataBas/lang.mdb" +"\"" +")");
//** där dynpath är resultatet av min class ovan.
</code>
Detta generera en asp-fil
<code>
Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="../../../_DataBas/lang.mdb")
</code>
... och oavsett var jag står någonstans, så får jag en korrekt sökväg.
Jag hoppas att detta exempel kan ge dig/er en tankeställare vad jag försöker att trixa med.Sv: Dynamisk sökväg
public string CreatePath(string current, string target)
{
string[] currentSegments =
current.Split(new char[] {'/'});
string[] targetSegments =
target.Split(new char[] {'/'});
int pointer = 0;
while( targetSegments[pointer].ToLower() == currentSegments[pointer].ToLower() )
pointer++;
string output = "";
for(int i = pointer; i < currentSegments.Length; i++)
output += "../";
for(int y = pointer; y < targetSegments.Length; y++)
output += targetSegments[y] + "/";
return output;
}
skicka med var du står och var du vill.
<b>PS.</b> Om du ska lägga in C# kod i forumet så kan du använda dig av < code c# > </ code > (utan mellanslagen) så highlightar den koden korrekt.
//Andreas
Sv: Dynamisk sökväg
Ifall du har filen i mappen "_DataBas" så är det bara att skicka in det i funktionen.
Ifall sidan ligger i mappen "Forum/Admin" så är det bara att skicka in det:
Anropet relativePath("Forum/Admin", "_DataBas") ger dig resultatet "../../_DataBas/".
Ifall du vill så kan du ju ändra funktionen så att destionationen alltid är "_DataBas", ifall du inte vill använda den till något annat.Sv: Dynamisk sökväg
Med ditt förslag så närmar vi oss vad jag ville ha.
Jag hittar inte var jag skall ändra på din kod, men när jag klickar på rootmappen då visar resultatet "../", vilket den inte skall göra, den skall ju visa ""(tom).
Jag försökte med output=output.Length(3); men fick bara error.
Annars så följer den ju mappningen perfekt.Sv: Dynamisk sökväg
I ärlighetens namn så är det hög tid för dig att investera i en bok eller läsa igenom dokumentationen då du missar på de enklaste sakerna så som att .Lenght på en sträng är ett property och inte en metod som tar en int parameter.
Dokumentatione till hela .NET Framework är helt gratis http://msdn.microsoft.com/library/en-us/dnanchor/html/netdevanchor.asp?frame=true utöver detta finns det väldigt bra .NET-skolor/artiklar både på pellesoft och på många andra webbsidor.
Genom att läsa på så slipper du att spendera över 2 dagar får att få rätt på en liten metod - det blir mycket enklare när du är bekväm med syntaxen och inte behöver oroa dig för den utan kan koncetrera dig 100% på att skriva en lösning.
//AndreasSv: Dynamisk sökväg
Funktionen relativePath() som jag postade tidigare är väldigt lik din funktion. Du har bara glömt att kolla mot längden på arrayerna i den första loopen... Å andra sidan så har du ToLower i jämförelsen, vilket inte är en så dum idé.Sv: Dynamisk sökväg
Håller på att sy ihop hela appen nu, och skall gå tillbaka för att optimera.