вобщем нужно скопировать один файл без помощи функции CopyFile. пробовал с помощью CreateFile, _lread, _lwrite ,но так копируются только три байта: 4Dh,5Ah,90h.
777user777 А почему такое странное сочетание? Попробуйте может тогда уже открывать с помощью _lopen _lcreate (знаю, что апи старые, но они удобнее новых). Или читать и писать с помощью CreateFile + Write/ReadFile. Или покажите код, может ошибка где-то, и вы пишите хендл например вместо содержимого.
Однозначно ошибка. У меня с CreateFile/ReadFile/WriteFile всё вполне успешно копируется. Правда, есть ещё атрибуты файла и потоки, которые нужно копировать (или не копировать) отдельно.
у меня эти функции вообще не работают,программа просто вылетает с ошибкой 0xC0000005. вот кусок кода: с Read/WriteFile Код (Text): invoke CreateFile, addr OldFile, GENERIC_READ, FILE_SHARE_READ,0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0 .IF eax != INVALID_HANDLE_VALUE mov hFile,eax invoke ReadFile, eax, addr FileBuff,16000,0,0 invoke CreateFile, addr NewFile, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_READ+FILE_SHARE_WRITE,0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL,0 .IF eax != INVALID_HANDLE_VALUE mov hFile2,eax invoke lstrlen, addr FileBuff invoke WriteFile, hFile2, addr FileBuff, eax,0,0 invoke CloseHandle, hFile2 .ENDIF invoke CloseHandle, hFile .ENDIF с _lwrite/_lread Код (Text): invoke CreateFile, addr OldFile, GENERIC_READ, FILE_SHARE_READ,0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0 .IF eax != INVALID_HANDLE_VALUE mov hFile,eax invoke _lread, eax, addr FileBuff,16000 invoke CreateFile, addr NewFile, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_READ+FILE_SHARE_WRITE,0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL,0 .IF eax != INVALID_HANDLE_VALUE mov hFile2,eax invoke lstrlen, addr FileBuff invoke _lwrite, InFl2, addr FileBuff, eax invoke CloseHandle, hFile2 .ENDIF invoke CloseHandle, hFile .ENDIF
А на каком этапе ошибка? пройдитесь отладчиком, где именно выдает ошибку? Может тут проблема? С мсдн Windows NT/2000/XP: Если параметр lpOverlapped имеет значение ПУСТО (NULL), параметр lpNumberOfBytesRead не может быть значением ПУСТО (NULL). Если lpOverlapped имеет - значение не ПУСТО (NULL), lpNumberOfBytesRead может быть значением ПУСТО (NULL). Может следует указать предпоследний параметр?
1) CopyFile != CreateFile + GetFileSize + ReadFile + WriteFile (Это касается сети как пример) 777user777 Делате GetFileSize, проверяте компресию файла GetFileAttributesW(OldFileName) & FILE_ATTRIBUTE_COMPRESSED. Что то типо Код (Text): invoke CreateFileW, OldFileName ,,,,, .IF eax != INVALID_HANDLE mov hFile ,eax invoke GetFileAttributesW, OldFileName .IF eax & FILE_ATTRIBUTE_COMPRESSED invoke GetCompressedFileSizeW, OldFileName, 0 .ELSE invoke GetFileSize, hFile, NULL .ENDIF mov dwFileSize , eax invoke VirtualAlloc ,,,,, ;HeapAlloc? .IF eax != 0 mov lpBuffer, eax invoke ReadFile hFile, eax, dwFileSize, .IF eax == 0 invoke MessageBoxA, NULL, "FAILED", "FAIL", MB_OK .ENDIF .ENDIF + FreeAlloc ; HeapFree
Вот пример со старыми апи, вроде все работает. Код (Text): .data oldfile db "C:\oldfile.txt",0 newfile db "C:\newfile.txt",0 buf db 1600 dup (0) .data? hndl dd ? .code start: invoke _lopen,addr oldfile,OF_READ mov hndl,eax invoke _lread,eax,addr buf,sizeof buf invoke _lclose,hndl invoke _lcreat,addr newfile,0 mov hndl,eax invoke _lwrite,eax,addr buf,sizeof buf invoke _lclose,hndl end start
777user777 Тебе уже сказали, что при не overlapped-чтении нужно обязательно задавать параметр lpNumberOfBytesRead - ук-ль на переменную, в которую возвращается реально прочитанное кол-во байт. Соотв-но это значение и нужно передавать в WriteFile, и цикл блочного чтения крутить до тех пор пока прочитанное кол-во >= запрашиваемого nNumberOfBytesToRead, равного размеру буфера FileBuff. А юзать lstrlen(FileBuff) вобще ни к селу ни для текстовых, ни тем более для двоичных файлов
А откуда тогда вы узнаете сколько байт туда покласть ежеле вам это все равно не будет известно? Нет проблемы- нет решения проблемы.
мне нужно вывести список файлов. я хочу найти все файлы в папке,поместить их имена в буфер,разделив их 0Dh 0Ah,но я не могу знать заранее сумму длин имён файлов+длину всех байтов 0Dh 0Ah