2015-06-20 6 views
0

Я пытаюсь создать приложение, используя построитель и заглушки, но я не в состоянииКак использовать построитель и окурок в WPF C#

Мой строитель код:

File.Copy(AppDomain.CurrentDomain.BaseDirectory + @"\Camstub.exe", filepath); 
      string split = "|"; 
      string info = split + CName.Text + split + Link.Text + split; 

      FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
      BinaryWriter bw = new BinaryWriter(fs); 
      fs.Position = fs.Length + 1; 
      bw.Write(info); 
      bw.Close(); 
      MessageBox.Show(info); 

Мой заглушкой код:

public MainWindow() 
    { 
     InitializeComponent(); 

     StreamReader sr = new StreamReader(System.Windows.Forms.Application.ExecutablePath); 
     BinaryReader br = new BinaryReader(sr.BaseStream); 
     byte[] fileData = br.ReadBytes(Convert.ToInt32(sr.BaseStream.Length)); 
     br.Close(); 
     sr.Close(); 

     ASCIIEncoding Enc = new ASCIIEncoding(); 
     string split = "|"; 
     string Message = Enc.GetString(fileData); 
     MessageBox.Show(Message); 

MessageBox в построителе показать мне:

http://embed.gyazo.com/d8f55ce5ea608b3861e64862242b0012.png

Приложение успешно строить, но MessageBox, когда я исполняю его показать мне:

enter image description here

Итак, я ожидаю, что же MessageBox в обоих.

Любая идея?

Заранее спасибо;)

+0

Ваш заглушка считывает первые байты xxx (xxx, равные длине файла) из исполняемого файла и помещает их в * info * (обратите внимание, что исполняемый файл Windows или файл DLL всегда начинаются с магических байтов «MZ»,). В вашем застройщике переменная * info * состоит из разных данных (* CName * и * Link *), поэтому не удивительно, что вы видите различия между сообщениями-заглушками и блоками-конструкторами. Нет причин ожидать, что два ящика сообщений будут показывать одни и те же данные ... – elgonzo

+0

Возможно, вы собираетесь прочитать данные Cname/Link, добавленные в конце файла? Если да, то это данные Cname/Link постоянной длины, то есть постоянное количество байтов; или может ли его длина быть переменной? – elgonzo

+0

Ty, гул, поэтому мне нужно прочитать в конце файла, но длина CName/Link может быть переменной. –

ответ

0

На основании информации, содержащейся в комментариях, вы хотите прочитать | CNAME | Ссылка | данные с конца файла. | CName | Ссылка | Данные могут иметь переменную длину.

Для обработки данных переменной длины вам необходимо указать длину байта данных. В данном сценарии простым и подходящим решением было бы сохранить длину байта как 2-байтовое или 4-байтное число в конце файла после | CName | Link | данные. 2-байтовое число (т. Е. ushort или UInt16) позволяет указать длину до 65536 и, вероятно, будет достаточной для вашей цели. (Если данные могут быть больше, чем 64 Кбайт, а затем использовать 4 байта для хранения длины.)

Таким образом, строитель должен сделать следующее:

  1. Compose | CName | Ссылка | Строковые данные и хранить их в info переменная.
  2. Преобразование строки в info в массив байтов с выбранной кодировкой текста. (Я бы предложил использовать текстовую кодировку UTF-8.)
  3. Добавить этот массив байтов в исполняемый файл.
  4. Добавить длину массива байтов как 2-байтовое число в конец исполняемого файла.


Заглушка должна сделать что-то вроде этого:

  1. Определить размер файла исполняемого файла.
  2. Открыть исполняемый файл для чтения.
  3. Установите текущую позицию файла в файлSize-2, поэтому длина | CName | Link | можно прочитать.
  4. Read номер 2-байтовый и хранить его в USHORT (или INT) переменной DATALENGTH.
  5. Установите текущую позицию файла в файлSize-2-dataLength.
  6. Прочитать байты | CName | Link | данные. Количество прочитанных байтов задается dataLength.
  7. Обработка | CName | Link | байты данных. Например, преобразуйте их в строку, используя ту же кодировку (), которая была использована разработчиком.
+0

Спасибо, что помогли, я уверен, что ваше решение хорошо, но я нашел еще один, я добавляю строку типа «-START-» перед «| CName | Link |» И я читаю весь поток, и я сохраняю информацию, следуя «-START-» –

+0

. Ваша программа-заглушка должна прочитать весь файл, чтобы найти маркер «-start-». Очень неэффективный способ делать вещи ... С моим подходом читаются только 2 + байты данных. Но опять же, я не знаю вашего сценария приложения. Возможно, производительность не имеет значения, и ваш подход подходит только для ваших целей ... :-) – elgonzo

+0

Но учтите следующее: что, если исполняемый файл уже содержит «-START-» где-нибудь в своих файлах? Тогда ваш подход не удастся, тогда как мой будет работать нормально ... Подсказка: это произойдет, потому что строковый литерал «-START-» будет частью скомпилированного кода на C# и, следовательно, уже будет частью скомпилированного исполняемого файла. :п – elgonzo