Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C#+WinAPI работа с файловой системой диска

50K
20 мая 2010 года
neo-n06
29 / / 17.02.2010
Здравствуйте !
Есть вот такая задача нужно удалить с тома файловую систему и работать с ним напрямую то есть записывать стирать только опеделенные сетора ...
Использовал функцию createfile для открытия диска но проблема в том что файлы то она открывает и считывает и записывает а вот диск не хочет ...
lasterror пишет 0 при открытии диска но вот SetFilePointer не хочет выполнять сразу ошибка 87 как и на запись и на чтение вот код взгляните пожалуйсто ...

класс

Код:
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);
        }
 
    }

  }


Проект для теста класса


Код:
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();
       }
 }
}


Заранее всем очень благодарен за помощь!
50K
20 мая 2010 года
neo-n06
29 / / 17.02.2010
Со всем разобрался...все работает смысл в том чтобы читать по числу байт кратному 512 ... а по меньшему числу считывать нельзя ???
1
21 мая 2010 года
kot_
7.3K / / 20.01.2000
Минимальный размер кластера - он и в африке - минимальный размер кластера. Меньше нельзя - на данной файловой системе по крайней мере.
50K
21 мая 2010 года
neo-n06
29 / / 17.02.2010
Да ... но почему тогда файл можно считать побайтно??
5
21 мая 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: neo-n06
Да ... но почему тогда файл можно считать побайтно??


Включаем голову!
Потому что чтение происходит из буфера, любезно предоставляемого драйвером файловой системы.

50K
22 мая 2010 года
neo-n06
29 / / 17.02.2010
:) Все понял спасибо ... теперь у меня проблема с Encoding.GetEncoding(251).GetString(byte[]);

в массиве тиба байт хранятся значения от 0 до 255 но он нормально преобразует только английские символы а русским дает значения от балды почему то ...
1
22 мая 2010 года
kot_
7.3K / / 20.01.2000
гм. А как насчет UNICODE?
50K
22 мая 2010 года
neo-n06
29 / / 17.02.2010
Цитата: kot_
гм. А как насчет UNICODE?



Не могу его использовать ... просто реализую некий способ шифрования выдуманный и в нем символы должны иметь кодировку от 0 до 255 и не более ...

1
22 мая 2010 года
kot_
7.3K / / 20.01.2000
это была не рекомендация. это был вопрос звущащмй примерно так: исключена ли вами возможность того, что вы работаете с двухбайтовыми символами, как с одно, и не это ли источник ваших проблем. :)
50K
22 мая 2010 года
neo-n06
29 / / 17.02.2010
:) Спасибо огромное во всем разобрался ... дело было вот в чем ... без надобности не надо создавать Streamreader и Binaryreader а так же обязательно их надо закрывать командойй .Close() вот ... обошелся обычным Filestream ом все прекрасно работает =) кодирует и раскодирует любые файлы
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог