20. august 2003 - 15:26Der er
9 kommentarer og 1 løsning
oprette foldere på et mappet netværksdrev
hejsa
jeg har et lille problem som jeg lige ville høre om nogen kunne hjælpe mig med.
jeg har lavet et lille program hvis funktion er at det skal skanne et drev/sti for directories og de directories som opfylder et bestemt kriterie skal den gå ind i og se om en bestemt mappe(f.eks. 2002 eller 2003) er oprettet. hvis den ikke er det skal den oprette den og x antal underfoldere hvis navne jeg har skrevet i et memobox.
alt dette virker fint på c:\drevet, men når jeg fortæller den at den skal gøre det på et af de to mappede netværksdrev hvor programmet faktisk skal bruges normalt (en gang årligt ihvertfald) tja så kører den mine løkker igennem fint nok, men den opretter ingen mapper.
er ret sikker på det er fordi det er netværksdrev, så en workaround ville være at bare køre programmet fra serveren og så bare vælge de mapper den skal køre programmet på. men det var jo meningen at sekretærene skulle kunne køre programmet.. og de skal sku ikke have lov til at logge ind på serverne.
har prøvet forskellige kommandoer til at oprette directories, men lige meget hjælper det. hvis jeg kører debuggeren kører den mine løkker fint igennem men den opretter ikke mapperne.
procedure TForm1.LavMappe(mappenavn : string); var sr : Tsearchrec ; s,k,l : string; I : integer; begin s:= mappenavn; if FindFirst(drev + ':' + '\*.*',faAnyFile,sr) = 0 then begin while (FindNext(sr) = 0) do begin if (sr.Attr = faDirectory) then begin L :=(drev +':\' + sr.name + '\' +s) ; if not (sr.name=('..')) then if length(sr.name)< 5 then if not DirectoryExists (L) then begin ForceDirectories(L); for I:=0 to (length(mnavn)-1) do begin K:=(drev +':\' + sr.name + '\' + s +'\' + mnavn[i] + '\'); if not directoryexists(k) then ForceDirectories(k); end; end; end; end; end; showmessage('done'); end;
det er den procedure som laver mapperne. har prøvet med andre kommandoer til at lave mapper også :-) hvad er det der for en GetLastError den har jeg ikke benyttet før?
Du må undskylde, men jeg synes at det er noget mystisk kode du har lavet. Der er nogle fejl i det: 1. Du bruger FindFirst/FindNext uden at bruge FindClose. En dødssynd. 2. Sådan som du har skrevet dit loop bruger du FindFirst og umiddelbart efter kalder du FindNext, så den første fil/mappe du finder med FindFirst skipper du simpelthen. Her ligger dit problem måske. 3. Et normalt FindFirst/FindNext/FindClose loop bør se sådan her ud: if FindFirst(drev + ':' + '\*.*', faAnyFile, sr) = 0 then try repeat if (sr.Name <> '.') and (sr.Name <> '..') then { gør noget med sr her } until FindNext(sr) <> 0; finally FindClose(sr); end;
den kan godt være du har ret i det.. tja må ærligt indrømme at det er længe siden jeg har programmeret sidst og jo det er blevet noget rodet noget :-)især efter at jeg begyndte at rode rundt i det da det ikke virkede på netværksdrevene :-) men prøver lige at rydde op i koden og sætte en findclose ind og se hvad der så sker!
procedure TForm1.LavMappe(mappenavn : string); var sr : Tsearchrec ; s,k,l : string; I : integer; begin s:= mappenavn; if FindFirst(drev + ':' + '\*.*', faAnyFile, sr) = 0 then try repeat if (sr.Name <> '.') and (sr.Name <> '..') then begin if (sr.Attr = 48) then begin L :=(drev +':\' + sr.name + '\' +s) ; if length(sr.name)< 5 then if not DirectoryExists (L) then begin MkDir(L); L := ''; for I:=0 to (length(mnavn)-1) do begin K:=(drev +':\' + sr.name + '\' + s +'\' + mnavn[i]); if not directoryexists(k) then MkDir(k); K := ''; end; end; end; end; until FindNext(sr) <> 0; finally FindClose(sr); end; end;
nu ser den sådan her ud. stadig samme fejl. Var nødt til at ændre attributten til '48' eftersom netværks drevet åbenbart har en anden directory attribut end et lokalt drev. fandt dog også ud af at jeg at enkelte af mapperne havde et problem med at give administrator adgang til oprettelse af nye mapper. men det var bare at give hovedmappen nye rettigheder så opdaterede den selv de få som der var problemer med. men nu arbejder jeg lidt videre med det selv. tak for hjælpen alle.
Det du laver med 48 er en fejl. 16 = faDirectory 32 = faArchive (arkiv attribut sat) Der kan være andre atributter sat. Du bør skrive if (sr.Attr and faDirectory) > 0 then {vi har et bibliotek}
tja det kan godt være det er en fejl, men det virker :-) men jeg har rettet det til noget andet og mere korrekt :-D
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.