Информация об изменениях

Сообщение Ура! нашлось. Но не работает именно с O_DIRECT от 15.05.2019 20:26

Изменено 15.05.2019 20:27 VladCore

Ура! нашлось. Но не работает именно с O_DIRECT
Здравствуйте, VladCore, Вы писали:


VC>Надо как то самому получить SafeFileHandle и передать его в констутор

VC>
VC>public FileStream(SafeFileHandle handle, FileAccess access, int bufferSize, bool isAsync);
VC>


Ура! нашёл. но с опцией O_DIRECT не работает. Кидает исключение ArgumentException. Выравнивание я сделал как надо. Вот код который работает. но с закоментированным O_DIRECT. А мне именно для O_DIRECT как раз и надо!


FileStream OpenFileStreamWithoutCacheOnLinux(int bufferSize)
{
var openFlags = /* Mono.Unix.Native.OpenFlags.O_DIRECT | */ Mono.Unix.Native.OpenFlags.O_RDONLY;
int handle = Mono.Unix.Native.Syscall.open(TempFile, openFlags);
IntPtr rawHandle = new IntPtr(handle);
SafeFileHandle fh = new SafeFileHandle(rawHandle, false);
FileStream fs = new FileStream(fh, FileAccess.Read, bufferSize, false);
return fs;
}

тут bufferSize, размер и файла и в fileStream.Read() передается везде 8192 байт что бы выравнивание соблюсти.
Но увы. работает только если O_DIRECT закоментировать

Как заставить с O_DIRECT работать
Ура! нашлось. Но не работает именно с O_DIRECT
Здравствуйте, VladCore, Вы писали:


VC>Надо как то самому получить SafeFileHandle и передать его в констутор

VC>
VC>public FileStream(SafeFileHandle handle, FileAccess access, int bufferSize, bool isAsync);
VC>


Ура! нашёл. но с опцией O_DIRECT не работает. Кидает исключение ArgumentException. Выравнивание я сделал как надо. Вот код который работает. но с закоментированным O_DIRECT. А мне именно для O_DIRECT как раз и надо!


FileStream OpenFileStreamWithoutCacheOnLinux(int bufferSize)
{
    var openFlags = /* Mono.Unix.Native.OpenFlags.O_DIRECT | */ Mono.Unix.Native.OpenFlags.O_RDONLY;
    int handle = Mono.Unix.Native.Syscall.open(TempFile, openFlags);
    IntPtr rawHandle = new IntPtr(handle);
    SafeFileHandle fh = new SafeFileHandle(rawHandle, false);
    FileStream fs = new FileStream(fh, FileAccess.Read, bufferSize, false);
    return fs;
}


тут bufferSize, размер и файла и в fileStream.Read() передается везде 8192 байт что бы выравнивание соблюсти.
Но увы. работает только если O_DIRECT закоментировать

Как заставить с O_DIRECT работать