public class LDrive
{
// Константы для CreateFile
const short FILE_ATTRIBUTE_NORMAL = 0x80;
const short INVALID_HANDLE_VALUE = -1;
const uint GENERIC_READ = 0x80000000;
const uint GENERIC_WRITE = 0x40000000;
const uint GENERIC_ALL = 0x10000000;
const short FILE_SHARE_NONE = 0;
const short FILE_SHARE_READ = 1;
const short FILE_SHARE_WRITE = 2;
const byte CREATE_ALWAYS = 2;
const byte OPEN_EXISTING = 3;
// Константы для SetFilePointer
public const uint Begin = 0;
public const uint Current = 1;
public const uint End = 2;
//Переменные
// Handle файла
public IntPtr pl;
public int N;
//--------------------------------------------------------------------------------
[DllImport("kernel32.dll", SetLastError = true)]
static extern int GetLastError();
// Импорт функции CreateFile
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
byte dwCreationDisposition,
short dwFlagsAndAttributes,
IntPtr hTemplateFile);
// Импорт функции ReadFile
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern bool ReadFile(IntPtr hFile, char[] lpBuffer,
uint nNumberOfBytesToRead, ref int N, int N1);
// Импорт функции WriteFile
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern bool WriteFile(IntPtr hFile, char[] lpBuffer,
uint nNumberOfBytesToWrite, ref int N, int N1);
// Импорт функции SetFilePointer
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern bool SetFilePointer(
IntPtr hFile,
uint lDistanceToMove,
int lpDistanceToMoveHigh,
int dwMoveMethod);
// Импорт функции CancelIo
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern bool CancelIo(
IntPtr hFile
);
// Импорт функции DeviceIoControl
[DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Unicode)]
static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode,
IntPtr lpInBuffer, uint nInBufferSize,
IntPtr lpOutBuffer, uint nOutBufferSize,
out uint lpBytesReturned, IntPtr lpOverlapped);
// Импорт функции CloseHandle
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr hObject);
//-----------------------------------------------------------------------------------
// Конструктор класса
// s - путь к файлу или устройство
public LDrive(string s , byte Metod )
{
pl = CreateFile(s, GENERIC_ALL, 0,
IntPtr.Zero, Metod, FILE_SHARE_READ | FILE_SHARE_WRITE , IntPtr.Zero);
}
// Установка указателя в файле
public bool Seek(uint LDistance, int current)
{
return SetFilePointer(this.pl, LDistance, 0, current);
}
// Закрыть хендл
public bool close()
{
return CloseHandle(this.pl);
}
// Записать
public bool Write(char[] buf , uint NofBytesToWrite)
{
return WriteFile(this.pl , buf, NofBytesToWrite , ref N , 0);
}
// Получить код ошибки
public int Error()
{
return GetLastError();
}
// Отмена операций ввода вывода
public bool Cancel()
{
return CancelIo(this.pl);
}
// Прочитать
public bool Read(char[] buf , uint NofBytesToRead )
{
return ReadFile(this.pl , buf, NofBytesToRead , ref N , 0);
}
}
}
C#+WinAPI работа с файловой системой диска
Есть вот такая задача нужно удалить с тома файловую систему и работать с ним напрямую то есть записывать стирать только опеделенные сетора ...
Использовал функцию createfile для открытия диска но проблема в том что файлы то она открывает и считывает и записывает а вот диск не хочет ...
lasterror пишет 0 при открытии диска но вот SetFilePointer не хочет выполнять сразу ошибка 87 как и на запись и на чтение вот код взгляните пожалуйсто ...
класс
Код:
Проект для теста класса
Код:
using System;
using System.IO;
using System.Security.AccessControl;
using impWinAPI;
namespace program
{
class program
{
const byte Create = 2;
const byte Open = 3;
static void Main()
{
bool k;
char[] bufw = new char[6];
bufw[0] = 'a';
bufw[1] = '7';
bufw[2] = '3';
bufw[3] = 'a';
bufw[4] = '7';
bufw[5] = '3';
LDrive ld = new LDrive("\\\\.\\G:", Open);
Console.WriteLine(ld.Error());
k = ld.Write(bufw, 10);
k = ld.Seek(0, 0);
Console.WriteLine(ld.Error());
k = ld.Seek(0,0);
Console.WriteLine(ld.Error());
char[] bufr = new char[10];
k = ld.Read(bufr, 10);
Console.WriteLine(ld.Error());
for (int n = 0; n < bufr.Length; n++)
Console.WriteLine(bufr[n]);
Console.WriteLine(ld.N);
Console.Read();
ld.close();
Console.Read();
}
}
}
using System.IO;
using System.Security.AccessControl;
using impWinAPI;
namespace program
{
class program
{
const byte Create = 2;
const byte Open = 3;
static void Main()
{
bool k;
char[] bufw = new char[6];
bufw[0] = 'a';
bufw[1] = '7';
bufw[2] = '3';
bufw[3] = 'a';
bufw[4] = '7';
bufw[5] = '3';
LDrive ld = new LDrive("\\\\.\\G:", Open);
Console.WriteLine(ld.Error());
k = ld.Write(bufw, 10);
k = ld.Seek(0, 0);
Console.WriteLine(ld.Error());
k = ld.Seek(0,0);
Console.WriteLine(ld.Error());
char[] bufr = new char[10];
k = ld.Read(bufr, 10);
Console.WriteLine(ld.Error());
for (int n = 0; n < bufr.Length; n++)
Console.WriteLine(bufr[n]);
Console.WriteLine(ld.N);
Console.Read();
ld.close();
Console.Read();
}
}
}
Заранее всем очень благодарен за помощь!
Со всем разобрался...все работает смысл в том чтобы читать по числу байт кратному 512 ... а по меньшему числу считывать нельзя ???
Минимальный размер кластера - он и в африке - минимальный размер кластера. Меньше нельзя - на данной файловой системе по крайней мере.
Да ... но почему тогда файл можно считать побайтно??
Цитата: neo-n06
Да ... но почему тогда файл можно считать побайтно??
Включаем голову!
Потому что чтение происходит из буфера, любезно предоставляемого драйвером файловой системы.
в массиве тиба байт хранятся значения от 0 до 255 но он нормально преобразует только английские символы а русским дает значения от балды почему то ...
гм. А как насчет UNICODE?
Цитата: kot_
гм. А как насчет UNICODE?
Не могу его использовать ... просто реализую некий способ шифрования выдуманный и в нем символы должны иметь кодировку от 0 до 255 и не более ...
это была не рекомендация. это был вопрос звущащмй примерно так: исключена ли вами возможность того, что вы работаете с двухбайтовыми символами, как с одно, и не это ли источник ваших проблем. :)
:) Спасибо огромное во всем разобрался ... дело было вот в чем ... без надобности не надо создавать Streamreader и Binaryreader а так же обязательно их надо закрывать командойй .Close() вот ... обошелся обычным Filestream ом все прекрасно работает =) кодирует и раскодирует любые файлы