6

とにかく私にとっては複雑なものです:)

基本的に私が達成したいのは、いくつかのテキストを生成し、このテキスト ファイルを 2 つのディレクトリ内に圧縮してから、それを MySQL blob フィールドにアップロードすることです。すべてディスクに何も書き込む必要はありません。私はこれらすべてに比較的慣れていないので、どんな指針も大歓迎です。これまでにまとめたものは次のとおりです。明らかにクラッシュして燃えますが、IDが何をしたいのかについてより良いアイデアが得られることを願っています. ああ、現在DotNetZipを使用しています:)

public void broadcastItem()
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            System.IO.StreamWriter sw = new System.IO.StreamWriter(ms);
            System.IO.MemoryStream ms2 = new System.IO.MemoryStream();
            sw.Write("Some Text generated and placed in a file");
            sw.Close(); //Text File Now Created

            using (ZipFile zip = new ZipFile())
            {

                zip.AddDirectory(@"Directory1\Directory2");
                //Zipping within two directories
                ZipEntry e = zip.AddEntry("Test", ms);
                e.
                e.Comment = "The content for entry in the zip file was obtained from a stream";
                zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G");
                zip.Save(ms2); //Trying to save to memory stream
            }

            try
            {
                OdbcConnection Server = new OdbcConnection("DSN=CentralServer");
                Server.Open();
                OdbcCommand DbCommand = Server.CreateCommand();
                DbCommand.CommandText = "INSERT INTO blobtest(blobfield) VALUES(?)";
                OdbcParameter param = new OdbcParameter("@file", SqlDbType.Binary);
                param.Value = ms2;
                DbCommand.Parameters.Add(param);
                DbCommand.ExecuteNonQuery();
                //Trying to save zip file from memory stream to blob field


            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

**編集 - 近づく** *

テキストファイルを作成してメモリに圧縮できるようになりました。問題は、テキストがファイルに表示されないことです-つまり、空白で、2つのディレクトリ内にファイルがあります:)

以下のコードを修正

public void test3()
        {
            MemoryStream ms = new MemoryStream();
            StreamWriter sw = new StreamWriter(ms);

            sw.WriteLine("HELLO!");
            sw.WriteLine("I WANT TO SAVE THIS FILE AS A .TXT FILE WITHIN TWO FOLDERS");
            ms.Position = 0;

            // create the ZipEntry archive from the xml doc store in memory stream ms
            MemoryStream outputMS = new System.IO.MemoryStream();

            ZipOutputStream zipOutput = new ZipOutputStream(outputMS);
            ZipEntry ze = new ZipEntry(@"Directory1\Directory2\example.txt");
            zipOutput.PutNextEntry(ze);
            zipOutput.Write(ms.ToArray(), 0, Convert.ToInt32(ms.Length));
            zipOutput.Finish();
            zipOutput.Close();

            byte[] byteArrayOut = outputMS.ToArray();
            outputMS.Close();
            ms.Close();
            try
            {
                OdbcConnection rstServer = new OdbcConnection("DSN=CentralServer");
                Server.Open();
                OdbcCommand DbCommand = Server.CreateCommand();
                DbCommand.CommandText = "INSERT INTO blobtest(blobfield) VALUES(?)";
                OdbcParameter param = new OdbcParameter("@file", SqlDbType.Binary);
                param.Value = byteArrayOut;
                DbCommand.Parameters.Add(param);
                DbCommand.ExecuteNonQuery();
                Response.Write(byteArrayOut.ToString());


            }

            catch (Exception ex)
            {
                Response.Write(ex.ToString());
            }
        }
4

2 に答える 2

2

基本的に、これは私が達成したかったことの全体のコンパイルであるため、今後同様の何かが必要な人のためにこれをまとめると思いました-これは実用的なコードです

public void diskLess()
        {
            MemoryStream ms = new MemoryStream();
            StreamWriter sw = new StreamWriter(ms);

            sw.WriteLine("HELLO!");
            sw.WriteLine("I WANT TO SAVE THIS FILE AS A .TXT FILE WITHIN TWO FOLDERS");
            sw.Flush(); //This is required or you get a blank text file :)
            ms.Position = 0;

            // create the ZipEntry archive from the txt file in memory stream ms
            MemoryStream outputMS = new System.IO.MemoryStream();

            ZipOutputStream zipOutput = new ZipOutputStream(outputMS);
            ZipEntry ze = new ZipEntry(@"dir1\dir2\whatever.txt");
            zipOutput.PutNextEntry(ze);
            zipOutput.Write(ms.ToArray(), 0, Convert.ToInt32(ms.Length));
            zipOutput.Finish();
            zipOutput.Close();
            byte[] byteArrayOut = outputMS.ToArray();
            outputMS.Close();

            ms.Close();
            try
            {
                OdbcConnection rstServer = new OdbcConnection("DSN=CentralServer");
                Server.Open();
                OdbcCommand DbCommand = Server.CreateCommand();
                DbCommand.CommandText = "INSERT INTO blobtest(blobfield) VALUES(?)";
                OdbcParameter param = new OdbcParameter("@file", SqlDbType.Binary);
                param.Value = byteArrayOut;
                DbCommand.Parameters.Add(param);
                DbCommand.ExecuteNonQuery();
                Response.Write(byteArrayOut.ToString());


            }

            catch (Exception ex)
            {
                Response.Write(ex.ToString());
            }

        }
于 2012-08-07T10:31:21.777 に答える
2

ここで説明されているように、オープン ソースの c# 圧縮ライブラリ SharpZipLib を使用してメモリ内 zip ファイルを作成できます。 SharpZipLib を使用したメモリ内圧縮

// zip XElement xdoc and add to requests MTOM value
using (MemoryStream ms = new System.IO.MemoryStream())
{   
   xdoc.Save(ms);  
   ms.Position = 0;

   // create the ZipEntry archive from the xml doc store in memory stream ms
   using (MemoryStream outputMS = new System.IO.MemoryStream())
   {
      using (ZipOutputStream zipOutput = new ZipOutputStream(outputMS))
      {
          ZipEntry ze = new ZipEntry("example.xml");
          zipOutput.PutNextEntry(ze);
          zipOutput.Write(ms.ToArray(), 0, Convert.ToInt32(ms.Length));
          zipOutput.Finish();
          zipOutput.Close();

          // add the zip archive to the request
          SubmissionReceiptListAttachmentMTOM = new base64Binary();
          SubmissionReceiptListAttachmentMTOM.Value = outputMS.ToArray();
      }

      outputMS.Close();
   }

   ms.Close();
}

あとは、メモリ ストリームをバイト配列に変換してデータベースに保存するだけです。

于 2012-08-07T08:38:31.610 に答える