[PHP] Filesize negatief

Pagina: 1
Acties:

Onderwerpen


  • storeman
  • Registratie: April 2004
  • Laatst online: 22-09 13:52
Beste tweakers,

ik heb een indexing systeem gemaakt voor mijn shares, op het lokale netwerk. Echter bij het inlezen van de bestandsgrootte van DVD's krijg ik soms NEGATIEVE waarden. Dit komt dus doordat php standaard met 32bits integers werkt.

op de php-site staat dan ook een oplossing:
PHP:
1
sprintf("%u", filesize($file));


Dit geeft echter ook niet het gewenste resultaat. Bij een DVD van 4.35 GB (windows) geeft php met deze functie 0.36 GB terug en de filesize functie geeft exact hetzelfde terug.

Die sprintf functie snap ik ook niet. Kan iemand mij helpen?

http://nl2.php.net/manual/nl/function.sprintf.php
http://nl2.php.net/manual/nl/function.filesize.php

Op de laatste link is ook te lezen dat bestanden tussen de 2 en 4 gig dit wel moet werken, maar dvd's zijn nu eenmaal groter dan 4 gig, iemand enig idee?

edit:

Ik heb het even geprobeerd met een bestand van 3 gig, dit gaat wel goed. Maar hoe de grotere bestanden te controleren?

[ Voor 9% gewijzigd door storeman op 22-09-2005 11:38 ]

"Chaos kan niet uit de hand lopen"


  • Tsjipmanz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 13:24

Tsjipmanz

Der Rudi ist da

De %u zal voor unsigned integer staan, max hiervoor is volgens mij 2^32 = 4,294,967,296 en daar past 4,35 Gig net niet in. Ik vind het trouwens wat een rare oplossing van die site, het enige dat sprintf doet is volgens mij gewoon een bepaalde waarde formatten. Als de waarde al niet in het datatype dat bij filesize hoort past, heeft het volgens mij ook niet veel nut om het tijdens de weergave te converteren naar een ander datatype.

There's no such thing as a mistake, just happy accidents - Bob Ross
Relaxte muziek: altijd okee!
- Soulseek rulez -


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Onder Windows kun je via de W32api functies van PHP wellicht GetFileSizeEx aanroepen:
code:
1
2
3
4
BOOL GetFileSizeEx(
  HANDLE hFile,
  PLARGE_INTEGER lpFileSize
);

Alhoewel PHP geloof ik niet zo fan is van pointers...

Professionele website nodig?


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

... en anders moet je het (zoals daar in de user comments ook staat) doen via shell_exec en dan met 'ls' (of 'dir') de grote opvragen.

Verwijderd

hoe zit het met die int, gaat van het grootste positieve int getal naar het grootste negatief getal en telt dan op ? als dit zo is, kun je een functie maken die telt hoe vaak dit gebeurt, en zo toch nog de grootte van het bestand leest...

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Hoe wil je tellen hoe vaak dat gebeurt binnen een andere PHP functie?

Bovendien is dat niet wat gebeurt. Windows geeft een 64 bits waarde, en PHP gooit de bovenste 32 bits weg. Bit 33 is 1 voor files tussen de 4Gb en 8Gb.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • storeman
  • Registratie: April 2004
  • Laatst online: 22-09 13:52
Ik ben bang dat ik niet zoveel met de reacties kan. Ik heb geen idee hoe ze te gebruiken. Heb net al een beetje de PHP manual doorzocht, maar kan weinig vinden over de win32_API, waarschijnlijk omdat deze nog experimenteel is.

Maar als ik het goed begrijp ligt de limit niet in de functie filesize, maar aan de maximale waarde in een variabele (integer), maar als ik:
PHP:
1
$var = filesize($file)/(1024*1024*1024);


Dan krijg ik nog geen goede uitkomst. Dus ik moet constateren dat ik de bestandsgrootte niet uit kan lezen met filesize?

"Chaos kan niet uit de hand lopen"


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 02:20
storeman schreef op donderdag 22 september 2005 @ 13:14:
PHP:
1
$var = filesize($file)/(1024*1024*1024);
Dat dit niet werkt is natuurlijk logisch, voordat je deelt door 1024 is het kwaad al geschiedt..

Roomba E5 te koop


Verwijderd

MSalters schreef op donderdag 22 september 2005 @ 12:39:
Hoe wil je tellen hoe vaak dat gebeurt binnen een andere PHP functie?

Bovendien is dat niet wat gebeurt. Windows geeft een 64 bits waarde, en PHP gooit de bovenste 32 bits weg. Bit 33 is 1 voor files tussen de 4Gb en 8Gb.
dan zal die nooit een negatief getal geven dus...

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Verwijderd schreef op donderdag 22 september 2005 @ 14:47:
[...]

dan zal die nooit een negatief getal geven dus...
Wel als dat 32 bits getal signed is...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • b19a
  • Registratie: September 2002
  • Niet online
Geen antwoord, wel een mogelijke oplossing: http://nl3.php.net/system

PHP:
1
2
$laatste_regel=system("dir ".$file->absolutePath);
var_dump($laatste_regel);

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22-09 12:22
Deze problematiek ben ik ook tegengekomen weliswaar met VB6.Hier maakte ik gebruik van een third party lib om de vrije diskspace op te vragen waar die werd teruggegevens als een LONG (32-bits). De oplossing was om via FreeClusters de schijfruimte zelf te gaan berekenen, zie hieronder:
Visual Basic:
1
2
3
4
5
6
7
8
Dim DiskSpace As Double

qps.QuerySystem

' Compute free space manually!
' do not use qps.FreeSpaceForDrive because it stores the free space in a long
' which overflows if free diskspace is more than 2 GB
DiskSpace = CDbl(qps.BytesPerSector) * CDbl(qps.SectorsPerCluster) * CDbl(qps.FreeClusters)

BytesPerSector en SectorsPerCluster zijn eigenschappen van je disk. De vraag is alleen of je in PHP een functie hebt om van een file op te vragen hoeveel clusters die inneemt. HTH :)

It’s nice to be important but it’s more important to be nice

Pagina: 1