Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как прочитать файловый поток?


Автор: Tectoder 11.11.2007, 19:25
Как прочитать поток(altternate file stream) ABC файла C:\1.txt, без использования функций WinApi?

Автор: stab 11.11.2007, 20:31
Хм, зачем они интересно это запретили для FileStream, не ясно. Может быть попробовать через CreateFile и потом хэнл передать в конструктор FileStream. В обычных конструкторах проверка вроде по пути файла осуществляется, может быть для хэндлов таких проверок нет.

Добавлено через 40 секунд
.. или надо абсолютно без Win32 API?

Автор: mr.DUDA 11.11.2007, 22:56
Без использования функций WinAPI невозможно прочитать файл. Даже fopen/fread внутри себя юзают тот самый CreateFile от которого вам нужно избавиться. Посему, юзайте FileStream, StreamReader и т.п. и не загоняйтесь.

Автор: Tectoder 12.11.2007, 00:46
Цитата(stab @  11.11.2007,  20:31 Найти цитируемый пост)
или надо абсолютно без Win32 API? 
Ну, я написал, нужно без WinAPI
Цитата(mr.DUDA @  11.11.2007,  22:56 Найти цитируемый пост)
Даже fopen/fread внутри себя юзают тот самый CreateFile от которого вам нужно избавиться. Посему, юзайте FileStream, StreamReader и т.п. и не загоняйтесь. 
 smile
Во первых, я не могу юзать WinAPI потому что политики безопасности на целевом компьютере запрещают использование импортов API-функций.
Во вторых, использование WinAPI лишает возможности запускать программу под mono, разве нет?

Автор: archeg 12.11.2007, 17:17
Цитата(Tectoder @  12.11.2007,  00:46 Найти цитируемый пост)
Во первых, я не могу юзать WinAPI потому что политики безопасности на целевом компьютере запрещают использование импортов API-функций.Во вторых, использование WinAPI лишает возможности запускать программу под mono, разве нет

Я так понимаю в случае FileStream, StreamReader юзаешь винапи не напрямую а через реализацию, которая написана уже во фреймворке. Соответственно на моно, она написана как-то по-другому, с использованием LinuxAPI  smile Код то от этого не меняется. И будет работать и там и там. Так в чем проблема тогда? 

Автор: stab 12.11.2007, 17:58
Цитата(Tectoder @  12.11.2007,  04:46 Найти цитируемый пост)
Ну, я написал, нужно без WinAPI

Значит придётся отказаться от использования потоков.  smile 

Автор: Tectoder 12.11.2007, 23:15
Цитата(archeg @  12.11.2007,  17:17 Найти цитируемый пост)
Так в чем проблема тогда?  
Эмм, предлагаю тебе углубится в суть топика

Автор: stab 13.11.2007, 05:53
Цитата(Tectoder @  12.11.2007,  04:46 Найти цитируемый пост)
Во вторых, использование WinAPI лишает возможности запускать программу под mono, разве нет? 

Под *nix есть схожий API потоков?

Как бы там ни было, можно попробовать достучаться через рефлекшен до каких-нибудь приватных членов, вроде Microsoft.Win32.Win32Native.SafeCreateFile. Незнаю правда что об этом думают политики безопасности. smile

Автор: Tectoder 13.11.2007, 12:02
Цитата(stab @  13.11.2007,  05:53 Найти цитируемый пост)
Под *nix есть схожий API потоков?
Ну если FS ext3 поддерживает потоки, то наверное и ядро?
Честно говоря, я ен представляю как через reflection достучаться до приватных членов. То есть получить инфу наверное получится, но вот как вызвать... Почти наверняка не получится.

Добавлено через 42 секунды
Кроме того Microsoft.Win32 это наверное то же что и com.sun в java, то бишь то, что порядочные приложения использовать не должны?

Автор: stab 13.11.2007, 14:34
Цитата(Tectoder @  13.11.2007,  16:02 Найти цитируемый пост)
Кроме того Microsoft.Win32 это наверное то же что и com.sun в java, то бишь то, что порядочные приложения использовать не должны? 

Да, это грязные трюки.

Автор: stab 16.11.2007, 05:09
на всякий случай:

Код

using System;
using System.Reflection;
using Microsoft.Win32.SafeHandles;
using System.IO;

namespace Vingrad.SafeCreateFile
{
    class Program
    {
        static void Main(string[] args)
        {
            Type win32Native = Type.GetType("Microsoft.Win32.Win32Native");

            MethodInfo safeCreateFile = win32Native.GetMethod("SafeCreateFile",
                BindingFlags.Static | BindingFlags.NonPublic);
            SafeFileHandle handle = (SafeFileHandle) safeCreateFile.Invoke(null,
                new object[] { @"c:\test.txt", GENERIC_READ, 0, null, OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL, null });

            StreamReader reader = new StreamReader(new FileStream(handle, FileAccess.Read));
            string text = reader.ReadToEnd();
            reader.Close();
            handle.Close();

            Console.WriteLine(text);
            Console.ReadLine();
        }

        const int GENERIC_READ = unchecked((int) 0x80000000); // :)
        const int OPEN_EXISTING = 3;
        const int FILE_ATTRIBUTE_NORMAL = 0x80;
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)