从列表视图导入/导出文本

时间:2012-09-22 16:37:31

标签: c# listview text openfiledialog savefiledialog

我有两个问题: 1-当我点击打开按钮时,它会向我显示 openfiledialog 两次(当我选择我的文件并单击确定时,它会再次重新打开选择窗口,只重复一次)。 2-我正在尝试从列表视图中导出和导入文本文件,到目前为止我设法从列表视图中导出文本文件,但我无法将其重新导入。

这是我的代码(对于这两种情况,因为它是同一个项目):

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    string path;
    //string fname;
    private void abtmenuItem10_Click(object sender, EventArgs e)
    {
        MessageBox.Show("DB Kai UB Text Extractor\n by Omarrrio 2012", "About...", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, 0, "http://gbatemp.net/user/245642-omarrrio/"); 
    }

    private void exitmenuItem4_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void sbtmenuItem5_Click(object sender, EventArgs e)
    {
        listView1.Items.Clear();
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Title = "Open Sbt File";
        ofd.Filter = "Sbt Files (*.sbt)|*.sbt|All Files (*.*)|*.*";
        //if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    }

    private void msgmenuItem6_Click(object sender, EventArgs e)
    {
        listView1.Items.Clear();
        pntrsmenuItem4.Text = "Number of Pointer = ";
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Title = "Open Msg File";
        ofd.InitialDirectory = Application.StartupPath;
        ofd.Filter = "Msg Files (*.msg)|*.msg|All Files (*.*)|*.*";
        DialogResult result = ofd.ShowDialog();
        if (result == DialogResult.Cancel)
            return;
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            path = ofd.FileName;
            BinaryReader br = new BinaryReader(File.OpenRead(path), Encoding.GetEncoding("Shift_JIS"));
            br.BaseStream.Position = 0x4;
            int num_pointers = br.ReadInt16();
            if (num_pointers == 0x56C)
            {
                MessageBox.Show("This File is not supported as it's pointer system is somehow F*cked up, please use another file, thank you.","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return;
            }
            else
            {
            MessageBox.Show("File opened Succesfully!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
            pntrsmenuItem4.Visible = true;
            pntrsmenuItem4.Text += num_pointers.ToString();
            List<int> offsets = new List<int>();
            for (int i = 2; i <= (num_pointers * 2); i += 2)
            {
                br.BaseStream.Position = i * 4 + 4;
                offsets.Add(br.ReadInt32());
                //listView1.Items.Add(br.ReadUInt32().ToString("X"));
            }
            Dictionary<int, string> values = new Dictionary<int, string>();
            for (int i = 0; i < offsets.Count; i++)
            {
                int currentOffset = offsets[i];

                int nextOffset = (i + 1) < offsets.Count ? offsets[i + 1] : (int)br.BaseStream.Length;

                int stringLength = (nextOffset - currentOffset - 1) / 2;

                br.BaseStream.Position = currentOffset;

                var chars = br.ReadChars(stringLength);
                values.Add(currentOffset, new String(chars));
            }

            foreach (int offset in offsets)
            {
                listView1.Items.Add(offset.ToString("X")).SubItems.Add(values[offset]);
            }

            br.Close();
            br = null;
            }
        }
        ofd.Dispose();
        ofd = null;
    }

    private void EtxtmenuItem8_Click(object sender, EventArgs e)
    {

        SaveFileDialog sfd = new SaveFileDialog();
        sfd.Title = "Save Text File";
        sfd.DefaultExt = ".txt";
        sfd.InitialDirectory = Application.StartupPath;
        sfd.Filter = "Text Files (*.txt)|*.txt";
        DialogResult result = sfd.ShowDialog();
        if (result == DialogResult.Cancel)
            return;
        StreamWriter wwrite = new StreamWriter(sfd.FileName, false, Encoding.Unicode);
        for (int i = 0; i < listView1.Items.Count; ++i)
        {
            string name = listView1.Items[i].SubItems[1].Text;
            wwrite.WriteLine("-" + name);
        }
        wwrite.Close();
    }

    private void ItxtmenuItem4_Click(object sender, EventArgs e)
    {
        OpenFileDialog ifd = new OpenFileDialog();
        ifd.Title = "Open Text File";
        ifd.Filter = "Text Files (*.txt)|*.txt";
        ifd.InitialDirectory = Application.StartupPath;
        DialogResult result = ifd.ShowDialog();
        if (result == DialogResult.Cancel)
            return;
        StreamReader sr = new StreamReader(ifd.FileName);
        int aa = 0;
        while (sr.Peek() >= 0)
        {
            string[] a2 = sr.ReadLine().Split('-');

            if (a2.Length == 2)
            {
                aa = int.Parse(a2[0].ToString());
                listView1.Items[aa].SubItems[1].Text = a2[1].Replace("~", "\n");
            }
            else
            {
                listView1.Items[aa].SubItems[1].Text += "\n" + a2[0];
            }

        }
        sr.Close();
    }
}

1 个答案:

答案 0 :(得分:1)

有点难以看到哪个菜单点击对应于此处的哪种方法,但我猜测有问题的代码是msgmenuItem6_Click。

Dialog出现两次的原因是因为你两次调用ShowDialog。

DialogResult result = ofd.ShowDialog();
if (result == DialogResult.Cancel)
    return;
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)

你应该这样做

if (result == System.Windows.Forms.DialogResult.OK)

关于您无法阅读文件的原因。您确定在您尝试阅读时有数据吗?为确保正确打开它,您还可以尝试File.ReadAllText并确保正确读取它。