создать FileStream с access right DELETE
От: jyuyjiyuijyu  
Дата: 12.03.14 00:34
Оценка:
Всем привет

сейчас есть такой код

void pending_to_remove(HANDLE hFile, BOOL bDelete)
{
    IO_STATUS_BLOCK io = {};

    NtSetInformationFile(hFile, &io, &bDelete, sizeof(BOOL), FileDispositionInformation);
}

auto_handle<FileStream> create_file(Track^ track)
{
    auto path = Path::ChangeExtension(make_output_fullpath(track), "PART");

    HANDLE hFile = CreateFileW(marshal_as<wstring>(path).c_str(), GENERIC_WRITE 
        | SYNCHRONIZE | DELETE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    pending_to_remove(hFile, TRUE);

    auto_handle<FileStream> file(gcnew FileStream((IntPtr)hFile, FileAccess::Write));

    return file;
}


тоесть создаю файл с особыми правами SYNCHRONIZE | DELETE для того чтобы потом подписаться на удаление NtSetInformationFile ...

сразу скажу обычный флаг DeleteOnClose не подходит так как от него не отписаться поэтому делаю через другой механизм который позволяет встать в очередь на удаление и сняться с неё...

в таком виде все работает но когда начинаешь создавать файл как то так

auto_handle<FileStream> file(gcnew FileStream(path, 
        FileMode::Create, FileAccess::Write, FileShare::Read));


то NtSetInformationFile начинает возвращать 0xc0000022 (access denied) ....

подскажите какие флаги нужно передать в конструктор FileStream дабы избавиться от CreateFile

спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.