Просмотр файла (аналог lister TotalCommander) - C#

Узнай цену своей работы

Формулировка задачи:

Подскажите пожалуйста, 1) возможно ли сделать чтобы из моего приложения все файлы открывались с помощью определенной программы (например AkelPad) не зависимо от расширения??? И как это реализовать на C#. Пытался реализовать через Process, но там используются ассоциации программ и расширений файлов. А нужно чтобы как в TotalCommander при нажатии на F3 или F4. 2) возможно ли использовать в собственном приложении Lister из TotalCommander?? 3) можно ли в ListBox сделать чтобы было тоже как в TotalCommander, чтобы было видно не только имя файла но и его размер и дату создания, как 3 различных столбца?? 4)столкнулся проблемой при считывании файла в 12 мб в RichTextBox, ошибка о том что в считываемом файле символов больше чем может отобразить компонент, подскажите как справиться с этим, может использовать другой компонент или какой нибудь другой способ. (в Lister TotalCommander свободно открывается и в Far тоже)

Решение задачи: «Просмотр файла (аналог lister TotalCommander)»

textual
Листинг программы
using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Text;
 
namespace WindowsFormsApplication75
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
            {
                FileStream stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read);
                FileViewer viewer = new FileViewer(stream);
                viewer.Parent = this;
                viewer.Dock = DockStyle.Fill;
            }
        }
    }
 
    //Просмотрщик больших файлов
    public class FileViewer : UserControl
    {
        Stream stream;
        int CharHeight;
        int CharWidth;
 
        public FileViewer(Stream stream)
        {
            this.stream = stream;
            //
            Font = new Font(FontFamily.GenericMonospace, 10);
            CharHeight = 15;
            CharWidth = 9;
            //
            AutoScroll = true;
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        }
 
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            stream.Dispose();
        }
 
        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);
            if (ClientRectangle.Width > 0)
            {
                int symbolsPerPageLine = ClientRectangle.Width / CharWidth;
                int linesPerPage = ClientRectangle.Height / CharHeight;
                int linesCount = (int)stream.Length / symbolsPerPageLine;
                AutoScrollMinSize = new Size(1, 1 + linesCount + ClientRectangle.Height - linesPerPage);
                VerticalScroll.SmallChange = 1;
                VerticalScroll.LargeChange = ClientRectangle.Height / CharHeight;
                Invalidate();
            }
        }
 
        protected override void OnScroll(ScrollEventArgs se)
        {
            base.OnScroll(se);
            Invalidate();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            //
            int symbolsPerLine = ClientRectangle.Width / CharWidth;
            int linesPerPage = ClientRectangle.Height / CharHeight;
            int startPos = VerticalScroll.Value * symbolsPerLine;
            stream.Seek(startPos, SeekOrigin.Begin);
            //
            byte[] buffer = new byte[symbolsPerLine];
            //
            for(int y=0; y < linesPerPage; y++)
            if (stream.Position < stream.Length)
            {
                int count = stream.Read(buffer, 0, buffer.Length);
                char[] chars = Encoding.Default.GetChars(buffer, 0, count);
                for (int x = 0; x < chars.Length; x++)
                    e.Graphics.DrawString(chars[x].ToString(), Font, Brushes.Black, x * CharWidth, y * CharHeight);
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы