DrKnS wrote: ↑Sun 16 Jul, 2017 00:53При сохранении фар открывает существующий файл с флагом TRUNCATE_EXISTING.
Ткну пальцем в небо и предположу, что этот флаг у вас обрабатывается криво.
Интересная теория. Test.c:
Code: Select all
#include <windows.h>
#include <stdio.h>
#define ITERATIONS_NUMBER 100000
#define ITERATIONS_STEP 1000
#define TEST_DATA_LENGTH1 1024
#define TEST_DATA_LENGTH2 (TEST_DATA_LENGTH1/2)
int main(int argc, char **argv) {
int i, j;
HANDLE hand;
DWORD dw;
char FileName[MAX_PATH], Data1[TEST_DATA_LENGTH1], Data2[TEST_DATA_LENGTH2], ReadBuff[(TEST_DATA_LENGTH1+TEST_DATA_LENGTH2)*2];
srand(time(NULL));
for(j=0x86, i=0; i<TEST_DATA_LENGTH1; i++, j=(j>>1)+rand()-1) Data1[i]=j%256;
for(i=0; i<TEST_DATA_LENGTH2; i++, j=(j>>1)+rand()-1) Data2[i]=j%256;
for(i=0; i<ITERATIONS_NUMBER; i++) {
sprintf(FileName, "Test_File_%u.bin", rand());
if ((hand=CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_ARCHIVE, NULL))==INVALID_HANDLE_VALUE) {
printf("Can't create file %s, err %d\n", FileName, GetLastError()); continue;
}
if (!WriteFile(hand, Data1, TEST_DATA_LENGTH1, &dw, NULL)||dw!=TEST_DATA_LENGTH1) printf("%s write error: %d bytes written, err %d\n", FileName, dw, GetLastError());
if (!CloseHandle(hand)) printf("Close %s, err %d\n", FileName, GetLastError());
if ((hand=CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW|TRUNCATE_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_ARCHIVE, NULL))==INVALID_HANDLE_VALUE) {
printf("Can't truncate file %s, err %d\n", FileName, GetLastError()); continue;
}
if (!WriteFile(hand, Data2, TEST_DATA_LENGTH2, &dw, NULL)||dw!=TEST_DATA_LENGTH2) printf("%s rewrite error: %d bytes written, err %d\n", FileName, dw, GetLastError());
if (!CloseHandle(hand)) printf("Close %s, err %d\n", FileName, GetLastError());
if ((hand=CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_ARCHIVE, NULL))==INVALID_HANDLE_VALUE) {
printf("Can't open file %s, err %d\n", FileName, GetLastError()); continue;
}
if (!ReadFile(hand, ReadBuff, sizeof(ReadBuff), &dw, NULL)||dw!=TEST_DATA_LENGTH2||memcmp(ReadBuff,Data2,dw)) printf("%s check failed: %d bytes readed, err %d\n", FileName, dw, GetLastError());
if (!CloseHandle(hand)) printf("Close %s, err %d\n", FileName, GetLastError());
if (!DeleteFile(FileName)) printf("%s remove error, err %d\n", FileName, GetLastError());
if (i%ITERATIONS_STEP==0) printf("\r%d...", i);
}
printf("Completed.\n");
return 0;
}
Написано в лоб, по рабоче-крестьянски, на виндовс-апи, чтобы исключить влияние С рантайма.
Code: Select all
T:\z>T:\z\test.exe
99000...
Completed.
T:\z>
Внезапно отработало все как положено. У ФАРа дрова виноваты с 1-2-3 попытки, а тут 100000 проверок, и драйвера ни разу не окривели.
В общем, позицию собравшихся здесь я понял, фар идеален, а если у кого-то что-то пошло не так, то он сам виноват. В целом позиция не новая, сталкивался, да. Дальнейшее обсуждение идеальности ФАРа я считаю бессмысленным.
Если есть что посоветовать или предложить проверить - я готов выслушать. А пока-что я откатываюсь на старую версию, мне работать надо, а не увлекаться занимательной ловлей глюков.