4

我在我的asp.net(c#)网站上有一个文件上传控件,用于上传带有要插入数据库的数据的csv文件,我的问题是,我无法获取上传文件的实际路径

它总是给我:C:\inetput\projectfolder\csvname.csv 它应该类似于:C:\Documents and settings\Pcname\Desktop\csvname.csv

但是通过文件上传的各种帖子,我知道文件需要先保存在服务器上,

使用Fileupload1.Saveas(savepath);

这是将文件保存在先前指定的位置所必需的,而实际上并不需要。(因为它会增加再次删除文件的开销)。

那么我所做的如下:

bool result = true;
strm = FileUpload1.PostedFile.InputStream;

reader2 = new System.IO.StreamReader(strm);

// **** new ****

FileInfo fileinfo = new FileInfo(FileUpload1.PostedFile.FileName);


string savePath = "c:\\"; // example "c:\\temp\\uploads\\"; could be any path

string fileName = fileinfo.Name;
string strFilePath = savePath.ToString();


savePath += fileName;

FileUpload1.SaveAs(savePath);

string strSql = "SELECT * FROM [" + fileinfo.Name + "]";

string strCSVConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFilePath + ";" + "Extended Properties='text;HDR=NO;'";

// load the data from CSV to DataTable 

OleDbDataAdapter oleda = new OleDbDataAdapter(strSql, strCSVConnString);

DataTable dtbCSV = new DataTable();

oleda.Fill(dtbCSV);

if (dtbCSV.Columns.Count != 2)
{
    result = false;
}

因为我想计算文件中的列数,所以我使用的是 oledb 阅读器。需要查询一个文件。

是否可以查询流?我不想保存文件,而是直接读取而不保存。

4

1 回答 1

1

不幸的是,您不能对流使用 OLEDB。

在必须使用 OLEDB 的情况下,我设法编写了一个IDisposable包装器,该包装器可以从流中提供一个临时文件并管理删除。

但是,您可以采用另一种方法来读取内容,而不保存它,例如直接从流中自己解析文件。我会推荐这个而不是包装器,因为您可以避免文件访问限制问题以及文件访问的开销。

这是一个有几种不同方法的 SO。

于 2012-07-23T11:58:24.287 回答