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