1

Outlook のメールをコピーしてフォームに貼り付けようとしています。貼り付け操作を実行するたびに、Outlook メール (MSG ファイル) が何らかのディレクトリに保存されるはずであり、以下に示すようにいくつかのコードを実装しました。

private void OutlookMailCopyPaste_KeyDown(object sender, KeyEventArgs e)
{
  if (e.Control && e.KeyCode == Keys.V)
  {
    if (Clipboard.ContainsData("FileGroupDescriptor"))
    {
      if (Clipboard.ContainsData("FileGroupDescriptorW"))
      {
        Stream fileStream = (Stream)Clipboard.GetData("FileGroupDescriptor");
        byte[] fileGroupDescriptor = new byte[fileStream.Length];
        fileStream.Read(fileGroupDescriptor, 0, fileGroupDescriptor.Length);
        fileStream.Close();
        System.Text.StringBuilder fileName = new System.Text.StringBuilder("");
        for (int i = 76; i < fileGroupDescriptor.Length; i++)
        {
          fileName.Append(Convert.ToChar(fileGroupDescriptor[i]));
        }

        //fileGroupDescriptor = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, fileGroupDescriptor);
        //string tempString = Encoding.UTF8.GetString(fileGroupDescriptor, 0, fileGroupDescriptor.Length);
        string tempString = fileName.ToString().Substring(fileName.ToString().IndexOf('.'));
        if (tempString.ToUpper().StartsWith(".MSG"))
        {
          if (Clipboard.ContainsData("FileContents"))
          {
            MemoryStream[] filestreams = (MemoryStream[])Clipboard.GetData("FileContents");
            if (filestreams != null && filestreams.Length > 0)
            {
              MemoryStream filestream = filestreams[0];
              //save the file stream using its name to the application path
              FileStream outputStream = File.Create(fileName.ToString());
              filestream.WriteTo(outputStream);
              outputStream.Close();
            }
          }
        }
        else
        {
          MessageBox.Show("Please copy and paste MSG file only.");
        }
      }
    }
  }
}

クリップボードのデータをメモリ ストリームに読み込むたびに、「プログラムの実行を続行するにはメモリが不足しています」などの例外が発生します。行で

MemoryStream[] filestreams = (MemoryStream[])Clipboard.GetData("FileContents");

さらに、この行の前にデータがあるかどうかを確認していますが、Clipboard.GetData("FileContents") に null があります

if (Clipboard.ContainsData("FileContents"))

よろしくお願いいたします。 ラメシュ・モラサ

4

0 に答える 0