Вы должны иметь возможность привести buffer
к byte*
, а затем увеличить его. С пустым указателем не связан размер, поэтому, если вы хотите переместить это определенное количество байтов в любом направлении, вы можете привести его к другому типу указателя (любого типа в этом отношении) и затем используйте размер приведенного типа в арифметике указателя, например:
buffer = (void *)((byte*)buffer + wrtn);
Строка выше переводит buffer
в байтовый указатель, затем увеличивает его позицию на wrtn
число байтов и затем возвращает новый указатель обратно в void *. Конечно, приведение к byte*
является очевидным выбором, если вы хотите выполнить произвольную арифметику с указателями.
Другая возможность - трактовать buffer
как byte*
все время и приводить его к void*
только когда вы передаете его WriteFile
.
Write(IntPtr handleFile, void* bufferData, uint length)
{
byte* buffer = (byte*)bufferData;
while (length > 0)
{
uint wrtn;
if (!WriteFile(handle, (void*)buffer, len, out wrtn, IntPtr.Zero))
{
// Do some error handling
}
buffer += wrtn;
len -= wrtn;
}
}
И, как последнее предложение, я бы рассмотрел вопрос об изменении подписи Write
для использования byte*
вместо void*
, потому что это сделает его более совместимым с другими вызывающими из C #, а byte*
больше смысла в этом случае. Вам не нужно беспокоиться о том, чтобы он совпадал с сигнатурой нативного API WriteFile, поскольку при передаче его можно преобразовать byte*
, как показано выше, в void*
.
Write(IntPtr handleFile, byte* bufferData, uint length)
{
while (length > 0)
{
uint wrtn;
if (!WriteFile(handle, (void*)bufferData, len, out wrtn, IntPtr.Zero))
{
// Do some error handling
}
bufferData+= wrtn;
len -= wrtn;
}
}
Увы, я должен согласиться с одним из комментаторов. Почему вы это делаете? Там
являются лучшими способами выполнить запись файла в c # с использованием многих потоковых классов.