首页 文章

从字节流中写入和读取

提问于
浏览
0

我有一个页面,用户可以上传自己的csv或输入值到列表框,然后创建一个csv(在后台) . 无论csv创建的方式如何,我都需要通过字节流将csv上传到我们的服务器 .

我的问题是,当我创建csv我不应该创建一个临时文件,我应该能够写入流然后读回来上传 . 如何删除临时文件的需要?

有效的当前代码(但使用临时文件):

try {
                string filename = DateTime.Now.ToString("MMddyyHmssf");
                filename = filename + ".csv";
                string directory = ConfigurationManager.AppSettings["TempDirectory"].ToString();
                path = Path.Combine(directory, filename);
                using (StreamWriter sw = File.CreateText(path)) {

                    foreach (ListItem item in this.lstAddEmailAddress.Items) {
                        sw.WriteLine(" , ," + item.ToString());
                    }
                }
            } catch (Exception ex) {
                string error = "Cannot create temp csv file used for importing users by email address.  Filepath: " + path + ".  FileException: " + ex.ToString();
                this.writeToLogs(error, 1338);
            }
        }
        // put here for testing the byte array being sent vs ready byte[] byteArray = System.IO.File.ReadAllBytes(path);
        myCsvFileStream = File.OpenRead(path);
        nFileLen = (int)myCsvFileStream.Length;

我试过了

Stream myCsvFileStream;
using (StreamWriter sw = new StreamWriter(myCsvFileStream)) {

                    foreach (ListItem item in this.lstAddEmailAddress.Items) {
                        sw.WriteLine(" , ," + item.ToString());

                    }
                }

但是,由于myCsvFileStream未初始化(因为stream是静态类),因此它始终为null .

以下是我在创建csv后对数据(字节流)所做的操作 .

byte[] file = new byte[nFileLen];
            myCsvFileStream.Read(file, 0, nFileLen);
            bool response = this.repositoryService.SaveUsers(this.SelectedAccount.Id, file, this.authenticatedUser.SessionToken.SessionId);
            myCsvFileStream.Close();

最后我使用 StringBuilder 来创建我的csv文件内容 . 然后获得了其内容的字节数组并用它来填充我的共享流(我说共享是因为当用户输入他们自己的CSV文件时它是 HttpPostedFile 但是当通过其余调用将其发送到我们的服务器时( respositoryservices.saveusers )它使用了与通过此方法相同的字节流)

StringBuilder csvFileString = new StringBuilder();

            sharedStreamForBatchImport = new MemoryStream();
            foreach (ListItem item in this.lstAddEmailAddress.Items) {
                csvFileString.Append(",," + item.ToString() + "\\r\\n");
            }

            //get byte array of the string
            byteArrayToBeSent = Encoding.ASCII.GetBytes(csvFileString.ToString());
            //set length for read
            byteArraySize = (int)csvFileString.Length;
            //read bytes into the sharedStreamForBatchImport (byte array)
            sharedStreamForBatchImport.Read(byteArrayToBeSent, 0, byteArraySize);

2 回答

  • 0

    你想创建一个 new MemoryStream()

  • 2

    这是我用来编写CSV文件的函数

    public static bool WriteCsvFile(string path, StringBuilder stringToWrite)
        {
            try
            {
                using (StreamWriter sw = new StreamWriter(path, false))         //false in ordre to overwrite the file if it already exists
                {
                    sw.Write(stringToWrite);
                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }
    

    stringToWrite只是一个以这种方式创建的字符串:

    public static bool WriteCsvFile(string path, DataTable myData)
        {
            if (myData == null)
                return false;
            //Information about the table we read
            int nbRows = myData.Rows.Count;
            int nbCol = myData.Columns.Count;
            StringBuilder stringToWrite = new StringBuilder();
    
            //We get the headers of the table
            stringToWrite.Append(myData.Columns[0].ToString());
            for (int i = 1; i < nbCol; ++i)
            {
                stringToWrite.Append(",");
                stringToWrite.Append(myData.Columns[i].ToString());
            }
            stringToWrite.AppendLine();
    
            //We read the rest of the table
            for (int i = 0; i < nbRows; ++i)
            {
                stringToWrite.Append(myData.Rows[i][0].ToString());
                for (int j = 1; j < nbCol; ++j)
                {
                    stringToWrite.Append(",");
                    stringToWrite.Append(myData.Rows[i][j].ToString());
                }
                stringToWrite.AppendLine();
            }
    
            return WriteCsvFile(path, stringToWrite);
        }
    

相关问题