2016-12-24 3 views
0

Я пытаюсь прочитать содержимое файла, но, несмотря на то, что он умеет писать в тот же файл. Я не могу прочитать это! Программа работает как Adminstator.C++ CreateFile can not read file ERROR_ACCESS_DENIED

Я попытался предоставить права «FILE_SHARE_WRITE | FILE_SHARE_READ», но все равно не работает.

DWORD dwBytesWritten = 0; 
unsigned long BytesRead = 0; 
HANDLE hFile = INVALID_HANDLE_VALUE; 
wchar_t text_file[MAX_PATH] = { 0 }; 


TCHAR *save_text(void) { 
    OPENFILENAME ofn = { 0 }; 
    TCHAR filename[512] = _T("C://Windows/EXAMPLE.txt"); 

    ofn.lStructSize = sizeof(ofn); 
    ofn.lpstrFilter = L"Txt files (*.txt)\0*.txt\0All Files\0*.*\0"; 
    ofn.lpstrFile = filename; 
    ofn.nMaxFile = sizeof(filename); 
    ofn.Flags = OFN_NONETWORKBUTTON | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_EXPLORER | OFN_HIDEREADONLY; 
    ofn.nFilterIndex = 1; 


    return(filename); 
} 




void WriteToFile(TCHAR *wText) 
{ 

    wchar_t loginchar[1000]; 

    hFile = CreateFile(text_file, FILE_APPEND_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL); 

    WriteFile(hFile, wText, wcslen(wText) * sizeof(wchar_t), &dwBytesWritten, NULL); // its writing without problem 
    ReadFile(hFile, loginchar, wcslen(loginchar) * sizeof(wchar_t), &BytesRead, NULL); // accses denied 

    ResultInFile(GetLastError()); // ResultInFile funcitons writes paramater to the file 
    //ResultInFile(BytesRead); // to see how many bytes read, but of course doesnt work.. 
    CloseHandle(hFile); 
} 

// this is the how file created at main function : 
hFile = CreateFile(txt_file, FILE_APPEND_DATA, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL); 
+0

Это совершенно неправильно, и оно не имеет ничего общего с именами файлов или открытыми файлами: 'TCHAR filename [512] = _T (" C: //Windows/EXAMPLE.txt "); // ... return (filename); '- Вы возвращаете указатель на локальную переменную (массив). Это неопределенное поведение **. Когда функция возвращается, этот массив указывает на мусор. – PaulMcKenzie

ответ

1

попробовать:

hFile = CreateFile(text_file, FILE_APPEND_DATA | FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL); 

вместо:

hFile = CreateFile(text_file, FILE_APPEND_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL); 

Обратите внимание, что FILE_SHARE_READ позволяет другим вызовы CreateFile просить разрешения на чтение, это не влияет на права доступа на чтение вашего дескриптора файла ,

+0

на этот раз ошибка 183 - УЖЕ_ЕКСИС ... почему? Я не создаю новый, который я читаю. – Elliot

+0

используйте CREATE_ALWAYS вместо OPEN_ALWAYS или удалите файл. – Ynon

+0

Но я не хочу, чтобы содержимое удалялось ... Я хочу их прочитать. – Elliot