Q&A

  • [질문] 실행중인 파일의 크기 측정시 문제인데...
저는 현재 파일 크기 측정에 아래이 함수를 사용하고 있습니다.
그런대 실행중인 파일 크기를 측정하면 0 으로 나옵니다.
다른 파일은 이상없는데 유독 MS word 를 측정하면 그렇게 나오는군요.
파일 탐색기에서 보면 멀쩡하게 나오는데 말입니다....
그전에 쓰던 함수는 그 아래에 담아두었는데 두번째 함수는 수천만 기가 바이트 형태로 나오는군요
어떻게 처리들 하고 계시는지요 ?


function F_File_Size(const xcd_File: string): Int64; // in bytes  2008-11-19 14   바꾼 이유는 ToolBar 에서 보면 word 가 실행중이면 수천 기가 바이트로 표시되는 것을 피하기 위함인데 지금은 그냥 0 으로 표시됨.
var
    vHandle                             : THandle;
    vLowPart, vHighPart                   : DWORD;
begin
    Result := 0;
    if FileExists(xcd_File) then
        begin
            vHandle := FileOpen(xcd_File, fmOpenRead or fmShareDenyWrite);
            if vHandle > 0 then
                try
                    vLowPart := Windows.GetFileSize(vHandle, @vHighPart);
                    if vLowPart <> INVALID_FILE_SIZE then
                        begin
                            TULargeInteger(Result).vLowPart := vLowPart;
                            TULargeInteger(Result).vHighPart := vHighPart;
                        end
                finally
                    FileClose(vHandle);
                end;
        end;
end;


function F_File_Size(const xcd_File: string): Int64;
var
    vHandle                             : integer;
    I, J                                : Cardinal;
    k                                   : Int64;
begin
    vHandle := CreateFile(PChar(xcd_File),
        GENERIC_READ,
        FILE_SHARE_READ,
        nil,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, 0);
    J := GetFileSize(vHandle, @I);
    CloseHandle(vHandle);
    if I > 0 then
        begin
            k := I;
            k := k shl 32;
            k := k + J;
        end
    else
        k := J;
    Result := k;
end;
3  COMMENTS
  • Profile
    장성호 2008.11.20 23:25
    GetFileSize로 ms-word에서 열려있는 문서를 체크하니 INVALID_FILE_SIZE 가 나오네요

    그래서 GetFileAttributesEx 를 이용해서 해보니까 괜찮네요

    <!--CodeS-->
    procedure TForm1.Button3Click(Sender: TObject);
    var
    data : WIN32_FILE_ATTRIBUTE_DATA;
    begin
    if OpenDialog1.Execute then
    begin
    GetFileAttributesEx(PChar(OpenDialog1.FileName),GetFileExInfoStandard,@data);
    ShowMessage('nFileSizeHigh='+IntToStr(data.nFileSizeHigh));
    ShowMessage('nFileSizeLow='+IntToStr(data.nFileSizeLow ));
    end;
    end;

    <!--CodeE-->

    그럼..
  • Profile
    이은주 2008.11.21 10:05
    아 그렇군요.
    너무 감사드립니다. 잘 쓰도록 하겠습니다.
  • Profile
    이은주 2008.11.21 11:28
    아주 잘되는군요.