Что такое SafeFileHandle в C # и когда я должен использовать? - PullRequest
1 голос
/ 26 октября 2019

Пока я еще изучаю System.IO, в конструкторах класса File Stream я обнаружил, что есть перегруженные конструкторы типа SafeFileHandle, я попытался выполнить поиск в Интернете и в документации MSDN. , но я ничего не могу понять, и я нашел даже незнакомых слов, таких как IntPtr, кто-нибудь может мне это объяснить?

public FileStream (Microsoft.Win32.SafeHandles.SafeFileHandle handle, System.IO.FileAccess access, int bufferSize, bool isAsync);

может кто-нибудь объяснить это, или есть хорошие сайты, на которых я могу поучиться ..?

1 Ответ

2 голосов
/ 26 октября 2019

https://docs.microsoft.com/en-us/dotnet/api/microsoft.win32.safehandles.safefilehandle?view=netframework-4.8

http://www.dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/whidbey/REDBITS/ndp/clr/src/BCL/Microsoft/Win32/SafeHandles/SafeFileHandle@cs/1/SafeFileHandle@cs

https://csharp.hotexamples.com/examples/-/SafeFileHandle/-/php-safefilehandle-class-examples.html

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=2ahUKEwizlPG3ornlAhVFCKwKHUl9DxIQFjABegQIAxAB&url=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fdotnet%2Fapi%2Fmicrosoft.win32.safehandles.safefilehandle.-ctor&usg=AOvVaw3M0YPCVH1439KghalbcDfG

https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream.safefilehandle?view=netframework-4.8

https://docs.microsoft.com/en-us/dotnet/api/microsoft.win32.safehandles.safefilehandle?redirectedfrom=MSDN&view=netframework-4.8

Эти ссылки предоставляют информацию о SafeFileHandle, а некоторые предоставляют исходный код.

Вы также можете проверить это: Как правильно закрыть дескриптор SafeFile

IntPtr ...

Это "родное (зависящее от платформы) целое число размера". Внутри он представлен как void *, но представлен как целое число. Вы можете использовать его всякий раз, когда вам нужно сохранить неуправляемый указатель и не хотите использовать небезопасный код. IntPtr.Zero фактически равен NULL (нулевой указатель).

Pointer ...

В общем случае (для разных языков программирования) указатель представляет собой число, представляющее физическое расположение в памяти. ,Нулевой указатель - это (почти всегда) указатель, который указывает на 0 и широко признан как «не указывающий ни на что». Поскольку системы имеют различное количество поддерживаемой памяти, для хранения этого числа не всегда требуется одинаковое количество байтов, поэтому мы называем «целое число собственного размера», которое может содержать указатель на любую конкретную систему.

SafeFileHandle kernel32 ...

[DllImport("kernel32.dll", SetLastError = true, CharSet=CharSet.Unicode)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
  uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
  uint dwFlagsAndAttributes, IntPtr hTemplateFile);

Еще с SafeFileHandle и kernel32 ...

[DllImport("kernel32.dll", SetLastError = true)]
static extern SafeFileHandle CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile);
private SafeFileHandle handleValue = null;
handleValue = CreateFile(
Path,
GENERIC_WRITE,
0,
IntPtr.Zero,
OPEN_EXISTING,
0,
IntPtr.Zero);

Хотя, если вы пытаетесь открыть File, затем используйте System.IO Controls

Чтобы просто открыть файл и прочитать весь его текст:

richTextBox1.Text = File.ReadAllText(yourfilename);

Вы можете изменить richTextBox1 на ваше Control имя.

Я надеюсь, что помогаю вам, Проф Софт:)

...