«Индекс находился за пределами массива» при запуске вне среды IDE - PullRequest
3 голосов
/ 27 сентября 2011

Я только начал изучать C # и создал этот простой генератор конфигурационных файлов для пусковой установки Minecraft, просто чтобы чем-то заняться.У меня возникают проблемы при попытке запустить приложение независимо от Visual C # 2010 - оно выдает "Индекс и длина должны указывать на местоположение в строке. Имя параметра: длина" при первом запуске (когдасоздается пустой текстовый файл) и "индекс находился за пределами массива" , если я запустил его снова после этого.

Я не понимаю, почему это происходит - это не такне дает мне никаких номеров строк, и это происходит только тогда, когда я не запускаю приложение через IDE (независимо от того, запускаю ли я отладочную сборку или сборку выпуска).Буду признателен за любую оказанную помощь.Я прошу прощения за возможно ужасное кодирование - я начинающий с этим языком.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Minecraft_Launcher_Config
{

    public partial class mcwindow : Form
    {

        private void outputText(string outtext)
        {
            output.Text = outtext;
        }

        private string encrypt(string text, int key)
        {
            string newText = "";

            for (int i = 0; i < text.Length; i++)
            {
                int charValue = Convert.ToInt32(text[i]);
                charValue ^= key;

                newText += char.ConvertFromUtf32(charValue);
            }

            return newText;
        }
        public mcwindow()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string iuser = "";
            string ipass = "";
            string imem = "1024";
            string iserver = "";
            if (System.IO.File.Exists("config.cfg"))
            {
                System.IO.StreamReader configFile =
                new System.IO.StreamReader("config.cfg");
                string[] iconfig = System.IO.File.ReadAllLines("config.cfg");
                iuser = iconfig[0];
                ipass = iconfig[1];
                imem = iconfig[2];
                iserver = iconfig[3];
                configFile.Close();
                outputText("Successfully loaded and decrypted config!");
            } else
            {
                System.IO.StreamWriter configwrite = new System.IO.StreamWriter("config.cfg");
                configwrite.Close();
                outputText("Welcome to Frohman's Minecraft Launcher Config!");
            }

            username.Text = iuser;
            memselect.Value = int.Parse(imem);
            int OKey = Convert.ToInt32(username.Text.Substring(0, 1));
            string unenpassword = encrypt(ipass, OKey);
            password.Text = unenpassword;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void saveexit_Click(object sender, EventArgs e)
        {
            if (username.Text != "" & password.Text != "")
            {
                outputText("Saving and exiting!");
                int IKey = Convert.ToInt32(username.Text[0]);
                string enpassword = encrypt(password.Text, IKey);
                string outString = username.Text + System.Environment.NewLine + enpassword + System.Environment.NewLine + memselect.Value + System.Environment.NewLine + serverip.Text;
                System.IO.StreamWriter configwrite = new System.IO.StreamWriter("config.cfg");
                configwrite.WriteLine(outString);
                configwrite.Close();
                System.Threading.Thread.Sleep(150);
                Environment.Exit(0);
            }
            else
            {
                outputText("You're missing some data!");
            }
        }

        private void password_TextChanged(object sender, EventArgs e)
        {

        }

    }
}

Ответы [ 3 ]

2 голосов
/ 27 сентября 2011

Этот код:

    string[] iconfig = System.IO.File.ReadAllLines("config.cfg");
    iuser = iconfig[0];
    ipass = iconfig[1];
    imem = iconfig[2];
    iserver = iconfig[3];

... выдаст исключение, о котором вы говорили, если файл содержит менее 4 строк. Это то, что происходит, возможно? (Вы говорите об этом, создавая пустой файл.)

Обратите внимание, что вы также открываете файл с StreamReader, но без всякой цели, учитывая, что вы также просто вызываете ReadAllLines, который откроет его отдельно.

Когда вы записываете файл с этим кодом:

System.IO.StreamWriter configwrite = new System.IO.StreamWriter("config.cfg");
configwrite.WriteLine(outString);
configwrite.Close();

это записывает только одну строку, предполагая, что outString не содержит разрывов строк ... поэтому я не уверен, как это может когда-либо работать, даже в IDE.)

(Обратите внимание, что если вы do хотите использовать StreamReader и StreamWriter, вам следует использовать операторы using, чтобы дескриптор файла закрывался, даже если есть исключения. здесь нужно использовать StreamReader или StreamWriter - вы можете использовать File.WriteAllLines или File.WriteAllText.)

Наконец, шифрование не должно выполняться поверх текста. Обычно вы получаете искаженный текст, который может легко содержать недопустимые единицы кода и т. Д. Обычно, если вы хотите зашифровать текст, вы конвертируете его в двоичный файл, применяете алгоритм шифрования стандартный (не пишите свой собственный) и затем, если вы хотите получить текст из него, вы конвертируете его в base64 с помощью Convert.ToBase64String.

1 голос
/ 27 сентября 2011

Прежде всего, не используйте StreamReader, если вы уже использовали File.ReadAllLines, это может закрыть файл и сделать его невозможным для метода File.readAllLines.

Попробуйте загрузить файл конфигурации с полным путем, например

string[] iconfig = System.IO.File.ReadAllLines(@"MyPath\config.cfg");

Чем быть проверенным

if(iconfig.length >= 4)
    //Proceed With Config

И последнее, если вы хотите использовать конфигурацию, чем использовать Application.Setting

0 голосов
/ 27 сентября 2011

String.SubString генерирует ArgumentOutOfRangeException, если
startIndex плюс длина указывает позицию, не входящую в этот экземпляр.

Во время первого запуска вы вызываете этот код:

    iuser="";
    ...
    username.Text = iuser;
    memselect.Value = int.Parse(imem);
    int OKey = Convert.ToInt32(username.Text.Substring(0, 1));

имя пользователя.Text.Substring (0, 1) находится за пределами массива, когда у вас есть пустая строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...