FileLen przekłamuje wartości

Forum poświęcone bazom danych

FileLen przekłamuje wartości

Postprzez jacek » 24 wrz 2010, o 09:40

Witam . Mam na serwerze katalog d:\Ms sql server.
Odczytuje z funkcji FileLen(ścieżka do pliku) wielkość pliku.
Oto wyniki pomiaru
plikdatawielkosc
Adresy_Data.MDF2010-09-24655622144
Adresy_Log.LDF2010-09-241980366848
jacek
 
Posty: 703
Dołączył(a): 14 cze 2012, o 09:04

Re: FileLen przekłamuje wartości

Postprzez _pietrzakjac » 24 wrz 2010, o 09:41

Przepraszam stronka się zawiesiła Jescze raz
Witam . Mam na serwerze katalog d:\Ms sql server.
Odczytuje z funkcji FileLen(ścieżka do pliku) wielkość pliku.
Oto wyniki pomiaru
plik    data    wielkosc
Adresy_Data.MDF 2010-09-24      655622144
Adresy_Log.LDF   2010-09-24      1980366848
_pietrzakjac
 
Posty: 3
Dołączył(a): 14 cze 2012, o 13:49

Re: FileLen przekłamuje wartości

Postprzez _pietrzakjac » 24 wrz 2010, o 09:41

Przepraszam stronka się zawiesiła Jescze raz
Witam . Mam na serwerze katalog d:\Ms sql server.
Odczytuje z funkcji FileLen(ścieżka do pliku) wielkość pliku.
Oto wyniki pomiaru
plik    data    wielkosc
Adresy_Data.MDF 2010-09-24      655622144
Adresy_Log.LDF   2010-09-24      1980366848
_pietrzakjac
 
Posty: 3
Dołączył(a): 14 cze 2012, o 13:49

Re: FileLen przekłamuje wartości

Postprzez jacek » 24 wrz 2010, o 09:43

Sorka jescze raz.
Witam . Mam na serwerze katalog d:\Ms sql server.
Odczytuje z funkcji FileLen(ścieżka do pliku) wielkość pliku.
Oto wyniki pomiaru
plik    data    wielkosc
Adresy_Data.MDF 2010-09-24      655622144
Adresy_Log.LDF  2010-09-24      1980366848

Rzeczywiste wartości w katalogu to:
Adresy_Data.MDF - 9,028 GB
Adresy_Log.LDF - 6,128 GB

Z czego wynika taka rożnica?
Jacek
jacek
 
Posty: 703
Dołączył(a): 14 cze 2012, o 09:04

Re: FileLen przekłamuje wartości

Postprzez jacek » 24 wrz 2010, o 09:50

doczytałem że trzeba funkcją LOF ,zaraz testuje
jacek
 
Posty: 703
Dołączył(a): 14 cze 2012, o 09:04

Re: FileLen przekłamuje wartości

Postprzez jacek » 24 wrz 2010, o 10:34

Niestety mam komunikat "permission denied". Można prosić o jakieś sugestie?
jacek
 
Posty: 703
Dołączył(a): 14 cze 2012, o 09:04

Re: FileLen przekłamuje wartości

Postprzez krzysztofnaworyta » 24 wrz 2010, o 12:05

jacek wrote:

| Witam . Mam na serwerze katalog d:\Ms sql server.
| Odczytuje z funkcji FileLen(ścieżka do pliku) wielkość pliku.
| Oto wyniki pomiaru
| plik data wielkosc
| Adresy_Data.MDF 2010-09-24 655622144
| Adresy_Log.LDF 2010-09-24 1980366848
|
| Rzeczywiste wartości w katalogu to:
| Adresy_Data.MDF - 9,028 GB
| Adresy_Log.LDF - 6,128 GB
|
| Z czego wynika taka rożnica?

Funkcja FileLen() zwraca liczbę long, której zakres kończy się na 2147483647
czyli ~2,1GB.
Przy plikach większych prawdopodobnie funkcja głupieje.

Znalazłem w sieci taki kawałek kodu dla plików przekraczających tę wielkość:

Sub testme()
Dim myFileName As String
Dim FSO As Object

Set FSO = CreateObject("Scripting.FileSystemObject")
myFileName = "C:\My Documents\giganticfilename.here")

MsgBox Format(FSO.GetFile(myFileName).Size, "#,##0")
End Sub

Być może można znaleźć też jakąś funkcję API, zamiast ładowania obiektu...
KN
krzysztofnaworyta
 
Posty: 279
Dołączył(a): 14 cze 2012, o 13:49

Re: FileLen przekłamuje wartości

Postprzez rafakwaczaa » 25 wrz 2010, o 10:21

Użytkownik "Krzysztof Naworyta" <k.naworyta@datacomp.com.pl>napisał w
wiadomości news:i7i45n$bbu$1@news.onet.pl...
jacek wrote:

(...)
Być może można znaleźć też jakąś funkcję API, zamiast ładowania obiektu...


Jeżeli chodzi o funkcję API to może być GetFileSize:
dla VB6: Declare Function GetFileSize Lib "kernel32" Alias "GetFileSize"
(ByVal hFile As Long, lpFileSizeHigh As Long) As Long
dla VB.NET: System.IO.FileInfo.Length

Można jednak posłużyć się następującym kodem z użyciem FileLen, kóry równiż
powinien podac prawidłową wielokość pliku (sprawdzone dla plików o
wielokości ponad 4GB):

<CODE>
Dim lngSize As Long
Dim dblSize As Double
lngSize = FileLen(sciezkadoduzegoplikuponad2gb)
If lngSize < 0 Then
dblSize = lngSize + 2 ^ 32
Else
dblSize = lngSize
End If
</CODE>
Pozdrawiam
Rafał Kwaczała
rafakwaczaa
 
Posty: 2
Dołączył(a): 14 cze 2012, o 13:50

Re: FileLen przekłamuje wartości

Postprzez jacek » 27 wrz 2010, o 08:24

Dzięki wszystkim pomogło.
jacek
 
Posty: 703
Dołączył(a): 14 cze 2012, o 09:04

Re: FileLen przekłamuje wartości

Postprzez krzysztofnaworyta » 27 wrz 2010, o 10:47

Rafał Kwaczała wrote:

| (...)
|| Być może można znaleźć też jakąś funkcję API, zamiast ładowania
|| obiektu...
||
|
| Jeżeli chodzi o funkcję API to może być GetFileSize:
| dla VB6: Declare Function GetFileSize Lib "kernel32" Alias
| "GetFileSize" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
|
| Można jednak posłużyć się następującym kodem z użyciem FileLen, kóry
| równiż powinien podac prawidłową wielokość pliku (sprawdzone dla
| plików o wielokości ponad 4GB):
|
| <CODE>
| Dim lngSize As Long
| Dim dblSize As Double
| lngSize = FileLen(sciezkadoduzegoplikuponad2gb)
| If lngSize < 0 Then
| dblSize = lngSize + 2 ^ 32
| Else
| dblSize = lngSize
| End If
| </CODE>

W obydwóch przypadkach zwracana liczba jest typu Long, więc NIE MA PRAWA
przekroczyć wartości ~2,14GB (jeśli wziąć wartość ze znakiem) lub ~4,3GB
(bez znaku).

W sieci znalazłem taki wątek (długi, bo z próba optymalizacji kodu):
http://us.generation-nt.com/answer/will ... tml?page=6

i postać funkcji (pozostałe deklaracje w wątku):

Public Const INVALID_HANDLE_VALUE = -1
Public Const MAXDWORD = 4294967296#

Function FileSizeApi(ByVal FilePath As String) As Currency
Dim hFile As Long
Dim wfd As WIN32_FIND_DATA
hFile = FindFirstFile(FilePath, wfd)
If hFile <>INVALID_HANDLE_VALUE Then
FindClose hFile
With wfd
FileSizeApi = CCur(.nFileSizeHigh) * MAXDWORD + nFileSizeLow
End With
Else
FileSizeApi = -1
End If
End Function
KN
krzysztofnaworyta
 
Posty: 279
Dołączył(a): 14 cze 2012, o 13:49

Następna strona

Powrót do Bazy danych

 


  • Powiązane tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość