как скопировать файл без CopyFile

Тема в разделе "MASM", создана пользователем 777user777, 23 фев 2012.

  1. 777user777

    777user777 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2010
    Сообщения:
    109
    вобщем нужно скопировать один файл без помощи функции CopyFile. пробовал с помощью CreateFile, _lread, _lwrite ,но так копируются только три байта: 4Dh,5Ah,90h.
     
  2. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    fopen fread fwrite fclose?
     
  3. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    777user777
    А почему такое странное сочетание? Попробуйте может тогда уже открывать с помощью _lopen _lcreate (знаю, что апи старые, но они удобнее новых). Или читать и писать с помощью CreateFile + Write/ReadFile.

    Или покажите код, может ошибка где-то, и вы пишите хендл например вместо содержимого.
     
  4. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Read/WriteFile
     
  5. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Однозначно ошибка. У меня с CreateFile/ReadFile/WriteFile всё вполне успешно копируется. Правда, есть ещё атрибуты файла и потоки, которые нужно копировать (или не копировать) отдельно.
     
  6. 777user777

    777user777 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2010
    Сообщения:
    109
    у меня эти функции вообще не работают,программа просто вылетает с ошибкой 0xC0000005.
    вот кусок кода:
    с Read/WriteFile

    Код (Text):
    1. invoke CreateFile, addr OldFile, GENERIC_READ, FILE_SHARE_READ,0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0
    2. .IF eax != INVALID_HANDLE_VALUE
    3. mov hFile,eax
    4. invoke ReadFile, eax, addr FileBuff,16000,0,0
    5. invoke CreateFile, addr NewFile, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_READ+FILE_SHARE_WRITE,0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL,0
    6. .IF eax != INVALID_HANDLE_VALUE
    7. mov hFile2,eax
    8. invoke lstrlen, addr FileBuff
    9. invoke WriteFile, hFile2, addr FileBuff, eax,0,0
    10. invoke CloseHandle, hFile2
    11. .ENDIF
    12. invoke CloseHandle, hFile
    13. .ENDIF
    с _lwrite/_lread

    Код (Text):
    1. invoke CreateFile, addr OldFile, GENERIC_READ, FILE_SHARE_READ,0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0
    2. .IF eax != INVALID_HANDLE_VALUE
    3. mov hFile,eax
    4. invoke _lread, eax, addr FileBuff,16000
    5. invoke CreateFile, addr NewFile, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_READ+FILE_SHARE_WRITE,0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL,0
    6. .IF eax != INVALID_HANDLE_VALUE
    7. mov hFile2,eax
    8. invoke lstrlen, addr FileBuff
    9. invoke _lwrite, InFl2, addr FileBuff, eax
    10. invoke CloseHandle, hFile2
    11. .ENDIF
    12. invoke CloseHandle, hFile
    13. .ENDIF
     
  7. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    А на каком этапе ошибка? пройдитесь отладчиком, где именно выдает ошибку? Может тут проблема?
    С мсдн
    Windows NT/2000/XP: Если параметр lpOverlapped имеет значение ПУСТО (NULL), параметр lpNumberOfBytesRead не может быть значением ПУСТО (NULL). Если lpOverlapped имеет - значение не ПУСТО (NULL), lpNumberOfBytesRead может быть значением ПУСТО (NULL).

    Может следует указать предпоследний параметр?
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    1) CopyFile != CreateFile + GetFileSize + ReadFile + WriteFile (Это касается сети как пример)


    777user777
    Делате GetFileSize, проверяте компресию файла

    GetFileAttributesW(OldFileName) & FILE_ATTRIBUTE_COMPRESSED.

    Что то типо
    Код (Text):
    1. invoke CreateFileW, OldFileName ,,,,,
    2. .IF eax != INVALID_HANDLE
    3. mov hFile ,eax
    4. invoke GetFileAttributesW, OldFileName
    5. .IF eax & FILE_ATTRIBUTE_COMPRESSED
    6. invoke GetCompressedFileSizeW, OldFileName, 0
    7. .ELSE
    8. invoke GetFileSize, hFile, NULL
    9. .ENDIF
    10. mov dwFileSize , eax
    11. invoke VirtualAlloc  ,,,,, ;HeapAlloc?
    12. .IF eax != 0
    13. mov lpBuffer, eax
    14. invoke ReadFile hFile, eax,  dwFileSize,
    15. .IF eax == 0
    16. invoke MessageBoxA, NULL, "FAILED", "FAIL", MB_OK
    17. .ENDIF
    18. .ENDIF
    19.  
    20. + FreeAlloc ; HeapFree
     
  9. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Вот пример со старыми апи, вроде все работает.

    Код (Text):
    1. .data
    2. oldfile db "C:\oldfile.txt",0
    3. newfile db "C:\newfile.txt",0
    4. buf db 1600 dup (0)
    5.  
    6. .data?
    7. hndl dd ?
    8.  
    9. .code
    10.  
    11.  
    12. start:
    13.    invoke _lopen,addr oldfile,OF_READ
    14.    mov hndl,eax
    15.    invoke _lread,eax,addr buf,sizeof buf
    16.    invoke _lclose,hndl
    17.    
    18.   invoke _lcreat,addr newfile,0
    19.   mov hndl,eax
    20.   invoke _lwrite,eax,addr buf,sizeof buf
    21.   invoke _lclose,hndl
    22.  
    23. end start
     
  10. 777user777

    777user777 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2010
    Сообщения:
    109
    а можно как-нибудь выделить буфер в памяти,размер которого заранее неизвестен?
     
  11. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Ну когда-то же он будет известен? Так и выделяется сразу после этого.
     
  12. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Возьмите больше, потом вернете )))
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    777user777
    Тебе уже сказали, что при не overlapped-чтении нужно обязательно задавать параметр lpNumberOfBytesRead - ук-ль на переменную, в которую возвращается реально прочитанное кол-во байт. Соотв-но это значение и нужно передавать в WriteFile, и цикл блочного чтения крутить до тех пор пока прочитанное кол-во >= запрашиваемого nNumberOfBytesToRead, равного размеру буфера FileBuff. А юзать lstrlen(FileBuff) вобще ни к селу ни для текстовых, ни тем более для двоичных файлов
     
  14. 777user777

    777user777 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2010
    Сообщения:
    109
    в том и дело,что не будет известно
     
  15. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    А откуда тогда вы узнаете сколько байт туда покласть ежеле вам это все равно не будет известно? Нет проблемы- нет решения проблемы.
     
  16. 777user777

    777user777 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2010
    Сообщения:
    109
    мне нужно вывести список файлов. я хочу найти все файлы в папке,поместить их имена в буфер,разделив их 0Dh 0Ah,но я не могу знать заранее сумму длин имён файлов+длину всех байтов 0Dh 0Ah
     
  17. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    NtQueryDirectoryFile
     
  18. 777user777

    777user777 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2010
    Сообщения:
    109
    можно подробнее? там нужно хэндл открытого файла передать,а его ещё открыть нужно...