Floppy error
От: DioNNis http://i-liger.com
Дата: 15.01.07 08:39
Оценка:
Пытаюсь открыть дискету вот таким способом:

            int i;
            byte[] buffer= new byte[512];
            int offset=int.Parse(textBox1.Text);


            try
            {
                FileSourse = new FileStream(label4.Text, FileMode.Open);
                FileDest = new FileStream("\\\\.\\A:", FileMode.Open);       !!!!!!
                textBox1.Text = FileSourse.Length.ToString();
                
                // Читаем в буффер и записываем на дискету
                for (i = 0; i < int.Parse(label6.Text); ++i)
                {
                    FileSourse.Read(buffer, 0, 512);
                    FileDest.Write(buffer, 0, 512);
                    FileSourse.Seek(512, SeekOrigin.Current);
                    FileDest.Seek(512, SeekOrigin.Current);
                }

            }
            catch (IOException exc)
            {
                MessageBox.Show(exc.ToString());
                return;
            }


Выдает ошибку, что дискета не доступна.
Если, что пожскажите пожалуйста другой способ, что бы писать данные в отдельные сектора на дискете.
Владея информацией, владеешь миром. Уинстон Черчилль
Re: Floppy error
От: vitz  
Дата: 15.01.07 09:05
Оценка:
Здравствуйте, DioNNis, Вы писали:

Эт в Nix'ах /dev/fd0 — есть флопик который можно прочитать как файл (если права есть), а тут уж звыняйте вам в сторону asm и 13h
здесь
Хотя может я и не прав
Re[2]: Floppy error
От: DioNNis http://i-liger.com
Дата: 15.01.07 09:20
Оценка:
Здравствуйте, vitz, Вы писали:

V>Здравствуйте, DioNNis, Вы писали:


V>Эт в Nix'ах /dev/fd0 — есть флопик который можно прочитать как файл (если права есть), а тут уж звыняйте вам в сторону asm и 13h

V>здесь
V>Хотя может я и не прав


=)))
нет на асме и на C++ я реализовал, меня интересует возможности NET

Если кому интересно:

int WriteSector(char sector, char cylinder, const char *p_buffer)
{
    char headnum=0;
    char drivenum=0;  // always 0 (A:)
    
    asm{
        mov ah, 03h             // write disk sectors from memory
        mov al, 01h              //  number of sectors to read/write (must be nonzero)
        mov ch, cylinder        // cylinder number (0..79).
        mov cl, sector            //  sector number (1..18).
        mov dh, headnum            // head number (0..1).
        mov dl, drivenum        // drive number (0..3 , for the emulator it depends on quantity of FLOPPY_ files).
        mov bx, p_buffer        // ES:BX points to data buffer.
        int 13h
    }            
        
    Test();
    return 0;
}
Владея информацией, владеешь миром. Уинстон Черчилль
Re[3]: Floppy error
От: vitz  
Дата: 15.01.07 09:31
Оценка:
Здравствуйте, DioNNis, Вы писали:

Ну если реализовал, то чего спрашивашь
Берешь свою функцию на C++ кладешь (ну или ложишь в dll) и через PInvoke тянешь в .NET
А по другому никак.
Re[4]: Floppy error
От: DioNNis http://i-liger.com
Дата: 15.01.07 09:37
Оценка:
Здравствуйте, vitz, Вы писали:

V>Здравствуйте, DioNNis, Вы писали:


V>Ну если реализовал, то чего спрашивашь

V>Берешь свою функцию на C++ кладешь (ну или ложишь в dll) и через PInvoke тянешь в .NET
V>А по другому никак.

Ну не ужели нельзя сделать на чистом C#?
Владея информацией, владеешь миром. Уинстон Черчилль
Re[5]: Floppy error
От: vitz  
Дата: 15.01.07 11:47
Оценка:
Здравствуйте, DioNNis, Вы писали:

DNN>Ну не ужели нельзя сделать на чистом C#?

А что такое по вашему?

на чистом C#?

Вы еще драйвера попробуйте на нем писать.
Практически весь Windows.Forms — это PInvoke обертка на WinAPI и ничего, пользуются и никто на нечистоту не жалуется
Re[6]: Floppy error
От: DioNNis http://i-liger.com
Дата: 17.01.07 05:42
Оценка:
Здравствуйте, vitz, Вы писали:

V>Здравствуйте, DioNNis, Вы писали:


DNN>>Ну не ужели нельзя сделать на чистом C#?

V>А что такое по вашему?
V>

V>на чистом C#?

V>Вы еще драйвера попробуйте на нем писать.
V>Практически весь Windows.Forms — это PInvoke обертка на WinAPI и ничего, пользуются и никто на нечистоту не жалуется


Ну драйвер не драйвер. А оспользовнаие Seek и Read я думаю не относится к области системного программировнаия. И очень жаль, что так обстаят дела в этой области... =(
Владея информацией, владеешь миром. Уинстон Черчилль
Re: Floppy error
От: Аноним  
Дата: 17.01.07 11:07
Оценка:
Здравствуйте, DioNNis, Вы писали:

DNN>Пытаюсь открыть дискету вот таким способом:


<skipped>

DNN>Выдает ошибку, что дискета не доступна.

DNN>Если, что пожскажите пожалуйста другой способ, что бы писать данные в отдельные сектора на дискете.

А MSDN почитать религия не позволяет? Ну никак, да?

The .NET Framework does not support direct access to physical disks through paths that are device names, such as "\\.\PHYSICALDRIVE0 ".


Делай импорт CreateFile() API.
Re[7]: Floppy error
От: vitz  
Дата: 17.01.07 11:22
Оценка:
Здравствуйте, DioNNis, Вы писали:

DNN>Ну драйвер не драйвер. А оспользовнаие Seek и Read я думаю не относится к области системного программировнаия. И очень жаль, что так обстаят дела в этой области... =(

Дела обстоят отлично, просто .NET создавался не для програмирования низкоуровневого доступа к диску.
Вы же не пытаетесь пилой гвозди забивать, ну или на asm XmlDOM программить(утрировано конеша но че поделаешь)?
Re: Floppy error
От: Morpheus_  
Дата: 17.01.07 11:40
Оценка: +1
Здравствуйте, DioNNis, Вы писали:

DNN>Пытаюсь открыть дискету вот таким способом:


DNN>
DNN>                FileDest = new FileStream("\\\\.\\A:", FileMode.Open);       !!!!!!
DNN>


DNN>Выдает ошибку, что дискета не доступна.


насколько я знаю, FileStream не поддерживает открытие устройств (т.е. всего что начинается с символов \\.\ ), если мне не изменяет память при попытке открыть такое устройство вываливается исключение в котором ясно сказано что FileStream не умеет открывать устройства

DNN>Если, что пожскажите пожалуйста другой способ, что бы писать данные в отдельные сектора на дискете.


Можно импортировать CreateFile от WinAPI, а полученый из него HANDLE передавать в конструктор FileStream и работать дальше с FileStream как обычно,
можно импортировать и остальные файловые функции WinAPI и работать через них,
можно поискать какуюнить обертку (хотя самому написать 5 минут дела)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Floppy error
От: DioNNis http://i-liger.com
Дата: 18.01.07 05:31
Оценка:
Вот я написал функцию на С++, подскажите пожалуйста, как это можно засунуть в *.dll и использовать потом в С#?


int Write2Sector(const char *FileName, int SectorTo, char *buffer)
{
    char buffer[512];
    int rd;

    DWORD le;
    HANDLE hFile = CreateFile (_T("\\\\.\\A:"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile == INVALID_HANDLE_VALUE) {
         le = GetLastError ();
    }
    BOOL res = SetFilePointer (hFile, 0, NULL, FILE_BEGIN);

    DWORD written;
    res = WriteFile (hFile, buffer, 512, &written, NULL);
    
    CloseHandle (hFile); 


    return 1;
}
Владея информацией, владеешь миром. Уинстон Черчилль
Re[2]: Floppy error
От: Morpheus_  
Дата: 18.01.07 11:28
Оценка:
Здравствуйте, DioNNis, Вы писали:

DNN>Вот я написал функцию на С++, подскажите пожалуйста, как это можно засунуть в *.dll и использовать потом в С#?



DNN>
DNN>int Write2Sector(const char *FileName, int SectorTo, char *buffer)
DNN>{
DNN>    char buffer[512];
DNN> //<skip>
DNN>}
DNN>


Допустим эту функцию ты поместил в fddio.dll (разумеется с экспортом Write2Sector), тогда так:

using System;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("fddio.dll")]
    static public extern int Write2Sector(string FileName, int sectorTo, byte[] buffer);
    
    static void Main()
    {
        byte[] buf = new byte[512];
        for(int i=0; i < buf.Length; i++)
            buf[i] = (byte)i;
        
        Write2Sector(@"\\.\A:", 0, buf);
    }
}


кстати FileName в твоей функции на C не используется и лучше сразу принимать юникодную строку и прямиком ее в CreateFile в неизменном виде отдавать, чтобы не было проблем с языками, код импорта в C# при этом изменять не нужно (при переходе на юникодную строку в C)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Floppy error
От: Аноним  
Дата: 17.01.07 07:53
Оценка:
Вообще то если бы это были seek и read в файле то да, но ты ж хочешь получить доступ к устройству. Нечего прикладным апликухам лазить куда непопадя, так что системное программирование.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.