/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Windows, finde tilgængelige drev
Fra : Niels Andersen


Dato : 13-05-02 08:37

Jeg er ved at lave noget PHP, hvor man bla. kan browse på sin egen
computer. Det virker også ganske glimrende, men giver dog problemer under
Windows.
Hvis man i Windows er i roden af et drev (Fx. E:\) og går én op, så får man
en liste over tilgængelige drev.
Hvordan kan jeg vise sådan en liste til brugere?

Det eneste jeg kan komme i tanker om er, at prøve at tilgå alt fra A-Z, men
så vil jeg jo starte alle drev op, ingen grund til det.
Desuden vil tomme drev til flytbare medier også melde fejl, og dermed ikke
dukke op på listen. :-/

--
Mvh.

Niels Andersen

 
 
Nezar Nielsen (14-05-2002)
Kommentar
Fra : Nezar Nielsen


Dato : 14-05-02 12:07

"Niels Andersen" <niels-usenet@myplace.dk> skrev i en meddelelse
news:z2KD8.4577$HN.138422@news010.worldonline.dk...
....
> Hvis man i Windows er i roden af et drev (Fx. E:\) og går én op, så får
man
> en liste over tilgængelige drev.
> Hvordan kan jeg vise sådan en liste til brugere?

Jeg ved at der findes et COM objekt der hedder Scripting.FileSystemObject,
og hvis du er på en windoze-maskine, har du vel også adgang til COM
udvidelsen af php.

Nu sad jeg lige og kedede mig og kiggede lidt på msdn.microsoft.com efter
det, og jeg vil skyde på(ud fra microsofts documentation) at du kan gøre
noget i stil med(overhovedet ikke testet):


$drivetypes=array(
"Unknown",
"Removable",
"Fixed",
"Network",
"CD-ROM",
"RAM Disk"
);

$fs=new COM("Scripting.FileSystemObject");
$drives=$fs->Drives; //Drives Collection

for($i=0;$i<$drives->Count();$i++){ //for at iterere i en Collection
$drive=$drives->Item($i); //Drive object
if($drive->DriveType == 3){
$name=$drive->ShareName;
}else{
$name=$drive->VolumeName;
}
printf("Navn: %s (%s), Type: %s - %.2d MB ledigt ud af %.2d MB,
filsystem: %s",
$name,
$drive->DriveLetter,
$drivetypes[$drive->DriveType],
$drive->FreeSpace / 1048576,
$drive->TotalSize / 1048576,
$drive->FileSystem
);
//tilgængeligt: $drive->AvailableSpace (højdetagning for quotas)
}

referencer

FileSystemObject:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbenlr98/ht
ml/vaobjfilesystemobject.asp

Drives Collection:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbenlr98/ht
ml/vaobjDrives.asp

Drive object:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbenlr98/ht
ml/vaobjDrive.asp


--
Mvh. Nezar Nielsen

Nano - Advances Simplicity
http://www.nano.dk/




Nezar Nielsen (14-05-2002)
Kommentar
Fra : Nezar Nielsen


Dato : 14-05-02 18:35

"Nezar Nielsen" <tumpen@fez.dk> skrev i en meddelelse
news:3ce0f00e$0$3768$d40e179e@nntp01.dk.telia.net...
....
> Jeg ved at der findes et COM objekt der hedder Scripting.FileSystemObject,
> og hvis du er på en windoze-maskine, har du vel også adgang til COM
> udvidelsen af php.
....

Nu blev jeg lige nød til at se om det virkede, det gjorde det selvfølgelig
ikke, men jeg fandt en måde at omgås det på, dog ret hacket..

Der er et virkende kodeeksempel her:
http://linux.control.dk/eksempler/phpCOM/


--
Mvh. Nezar Nielsen

Nano - Advances Simplicity
http://www.nano.dk/





Niels Andersen (14-05-2002)
Kommentar
Fra : Niels Andersen


Dato : 14-05-02 19:17

Nezar Nielsen wrote in <3ce14b02$0$3762$d40e179e@nntp01.dk.telia.net>:
> Nu blev jeg lige nød til at se om det virkede, det gjorde det selvfølgelig
> ikke,

Så er jeg da glad for at du testede det, da jeg ikke har den store mulighed
for at teste/lege med det. :)

> men jeg fandt en måde at omgås det på,

Og det her er jeg især glad for. :)

Mit Windows-kode er sådan noget kode-kode-kode, tage på arbejde og se om
det virker, tage hjem om aftenen og rette fejl etc.
Dvs. "trial-and-error" ville tage evigheder. :)

> dog ret hacket..

Jeg skal nok selv gøre det kønnere, og (hvis jeg husker det) poste den
endelige funktion. :)

> Der er et virkende kodeeksempel her:
> http://linux.control.dk/eksempler/phpCOM/

Der er et par ting jeg er bekymrede for, men det må jeg se på i morgen om
der er grund til. :)

Jeg har ikke lyst til at kontakte alle drevene (floppy-drev larmer, cd'er
spinner up etc.), og jeg ved ikke lige om disse linjer har den effekt:

$drive=@$drives->Item($i);
[...]
if($drive->IsReady()){

Især den sidste bekymrer mig, men den kan jeg vist også undvære. :)

Det her drejer sig godt nok mere om Windows end PHP (synes jeg i hvert
fald), men jeg vi kan vist lige så godt gøre det færdigt her. Især når nu
vi pakker essensen ind i PHP-kode.

(Overvejede egentlig at spørge i en Windows-gruppe, men opgav på forhånd,
da jeg kender Windows-gruppen.)

--
Mvh.

Niels Andersen

Niels Andersen (14-05-2002)
Kommentar
Fra : Niels Andersen


Dato : 14-05-02 20:24

Niels Andersen wrote in <iwcE8.5315$HN.217336@news010.worldonline.dk>:
> Jeg skal nok selv gøre det kønnere, og (hvis jeg husker det) poste den
> endelige funktion. :)

Nu er det vist "kønt nok", og tilpasset den mine ønsker. Det er ikke
testet, det bliver først i morgen. Sig lige til, hvis du ikke vil have
navn og/eller email i koden. Dette kommer (med lidt held) ud til rigtigt
mange mennesker!
Jeg håber linjerne ikke bliver ombrudt. :)

function windrives() {
/*
Get list of drives in Windows via COM
references:

FileSystemObject:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbenlr98/html/vaobjfilesystemobject.asp

Drives Collection:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbenlr98/html/vaobjDrives.asp

Drive object:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbenlr98/html/vaobjDrive.asp

Thanks to: "Nezar Nielsen" <tumpen@fez.dk>
*/

$drivetypes = array(
"Unknown",
"Removable",
"Fixed",
"Network",
"CD-ROM",
"RAM Disk"
);

$drivelist = array();
$return = array();

$fs = new COM("Scripting.FileSystemObject");
$drives = $fs->Drives(); //Drives Collection

//pupulate drivelist by cheating with checking each possible driveletter,
//since we cant iterate a collection, but we know what the collection can consist of.
//(network mounts without drivenames are thus not available)
$total = $drives->Count()
for ($i = a; $i <= z; $i++) {
$drive = @$drives->Item($i);
if ($drive){
$hits++;
$drivelist[] = $drive;
}
if ($hits == $total){
break;
}
}

foreach ($drivelist as $drive) {
if ($drive->DriveType == 3) {
$name = $drive->ShareName;
} else {
$name = $drive->VolumeName;
}
$type = $drivetypes[$drive->DriveType];
$return[$drive->DriveLetter] = "$name ($type)";
}
}

--
Mvh.

Niels Andersen

Nezar Nielsen (14-05-2002)
Kommentar
Fra : Nezar Nielsen


Dato : 14-05-02 22:34

"Niels Andersen" <niels-usenet@myplace.dk> wrote in message
news:ovdE8.5329$HN.220742@news010.worldonline.dk...
> Nu er det vist "kønt nok", og tilpasset den mine ønsker. Det er ikke
> testet, det bliver først i morgen. Sig lige til, hvis du ikke vil have
> navn og/eller email i koden. Dette kommer (med lidt held) ud til rigtigt
> mange mennesker!

lidt famewhore er man vel altid, så næeh, ingen problemer for min skyld :)

....
> $type = $drivetypes[$drive->DriveType];
> $return[$drive->DriveLetter] = "$name ($type)";
> }
return $return; # :)
> }

--
Mvh. Nezar Nielsen

Nano - Advanced Simplicity
http://www.nano.dk/




Nezar Nielsen (14-05-2002)
Kommentar
Fra : Nezar Nielsen


Dato : 14-05-02 22:29

"Niels Andersen" <niels-usenet@myplace.dk> wrote in message
news:iwcE8.5315$HN.217336@news010.worldonline.dk...
> Mit Windows-kode er sådan noget kode-kode-kode, tage på arbejde og se om
> det virker, tage hjem om aftenen og rette fejl etc.
> Dvs. "trial-and-error" ville tage evigheder. :)

vmware ? :)

....
> Der er et par ting jeg er bekymrede for, men det må jeg se på i morgen om
> der er grund til. :)
>
> Jeg har ikke lyst til at kontakte alle drevene (floppy-drev larmer, cd'er
> spinner up etc.), og jeg ved ikke lige om disse linjer har den effekt:
>
> $drive=@$drives->Item($i);
> [...]
> if($drive->IsReady()){

Nej, pointen med IsReady er netop at den kontrollerer (windows knows
all...ehrm) om drevene er klar, dvs. den prøver ikke at tilgå en floppy,
hvis der ikke er nogen disk i - Hvis man ikke bruger IsReady og bare går
direkte til at spørge efter navn osv, så er det fejlene begynder at melde
sig, men det kan du jo prøve at kigge på, når du sidder ved en windåse.
Sådan som jeg kontrollerede, var den måde jeg kunne slippe for at windows
brokkede sig over, at man prøvede at hente info om et drev, der ikke var
aktivt..

Og ja, det her er COM specifikt, men det er trods alt via php, så mon ikke
folk kan overleve :)
Der skorter(der var et par links på php-sitet i kommentarer) generelt ret
meget på eksempler på hvordan man bruger COM extensionen, så at der er nogen
der har lavet det her eksempel, må betegnes som et plus..

--
Mvh. Nezar Nielsen

Nano - Advanced Simplicity
http://www.nano.dk/




Niels Andersen (15-05-2002)
Kommentar
Fra : Niels Andersen


Dato : 15-05-02 07:21

Nezar Nielsen wrote in <3ce181ba$0$51094$edfadb0f@dspool01.news.tele.dk>:
>> Mit Windows-kode er sådan noget kode-kode-kode, tage på arbejde og se om
>> det virker, tage hjem om aftenen og rette fejl etc.
>> Dvs. "trial-and-error" ville tage evigheder. :)
> vmware ? :)

Nope, for dyrt.
bochs der imod er en mulighed. :)
Faktisk skulle wine kunne klare det.

Jeg gider dog ikke lige sætte nogle af delene op lige nu. :)

Heldigvis har jeg en licens til Windows 98, det er vist det sværeste at
komme uden om uden at betale. :)

>> Jeg har ikke lyst til at kontakte alle drevene (floppy-drev larmer, cd'er
>> spinner up etc.), og jeg ved ikke lige om disse linjer har den effekt:
>> if($drive->IsReady()){
> Nej, pointen med IsReady er netop at den kontrollerer (windows knows
> all...ehrm) om drevene er klar, dvs. den prøver ikke at tilgå en floppy,
> hvis der ikke er nogen disk i

Fx. floppy-drev kan man ikke vide om der er disk i uden at tilgå den...

Nu prøver jeg uden IsReady(), og ser om ikke det er, som jeg forventer. :)

> Sådan som jeg kontrollerede, var den måde jeg kunne slippe for at windows
> brokkede sig over, at man prøvede at hente info om et drev, der ikke var
> aktivt..

Hvis folk prøver at tilgå et drev uden medie, så har de fortjent en
fejlmeddelelse.

> Der skorter(der var et par links på php-sitet i kommentarer) generelt ret
> meget på eksempler på hvordan man bruger COM extensionen, så at der er
> nogen der har lavet det her eksempel, må betegnes som et plus..

Ja, de få eksempler jeg har set har været fuldstændigt meningsløse. :)

--
Mvh.

Niels Andersen

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste