(Benim bu soruya asıl cevap yanıltıcı olduğunu Sonradan Adobe Reader ile açıldı PDF dosyaları için tamam çalıştı, ama öyle olmadı. her zaman diğer dosya türleri için uygun şekilde çalışır. Aşağıdaki düzeltme sürümüdür.)
Maalesef, bir dosyanın içeriğini doğrudan Access Attachment
alanında OleDb kullanarak alamıyoruz. Access Veritabanı Altyapısı, dosyanın ikili içeriğine bazı meta verileri ekler ve .FileData
'u OleDb aracılığıyla alırsak meta veriler eklenir.
Örnek vermek gerekirse, "Document1.pdf" adlı bir belge Erişim Arayüzü kullanılarak bir Ek alanına kaydedilir. Bu PDF dosyası başlangıcı şuna benzer:
biz denemek ve diske
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = con;
cmd.CommandText =
"SELECT Attachments.FileData " +
"FROM AttachTest " +
"WHERE Attachments.FileName='Document1.pdf'";
using (OleDbDataReader rdr = cmd.ExecuteReader())
{
rdr.Read();
byte[] fileData = (byte[])rdr[0];
using (var fs = new FileStream(
@"C:\Users\Gord\Desktop\FromFileData.pdf",
FileMode.Create, FileAccess.Write))
{
fs.Write(fileData, 0, fileData.Length);
fs.Close();
}
}
}
PDF dosyasını ayıklamak için aşağıdaki kodu kullanmak istersek sonuç dosyası içerecektir dosyanın başında meta (bu durumda 20 bayt)
Adobe Reader, bu dosyayı açabilir çünkü '% PDF-1.4' imzası öncesinde dosyada görünebilecek herhangi bir "önemsiz" öğesini yok saymaya yetecek kadar sağlamdır. Ne yazık ki, tüm dosya formatları ve uygulamaları, dosyanın başında gereksiz baytlar için çok bağışlayıcı değildir.
Access'te bir
Attachment
sahadan dosyaların ayıklanması
sadece Resmi ™ yolu, bir ACE DAO
Field2
nesnenin
.SaveToFile
yöntemi kullanmak şöyle etmektir
:
// required COM reference: Microsoft Office 14.0 Access Database Engine Object Library
//
// using Microsoft.Office.Interop.Access.Dao; ...
var dbe = new DBEngine();
Database db = dbe.OpenDatabase(@"C:\Users\Public\Database1.accdb");
Recordset rstMain = db.OpenRecordset(
"SELECT Attachments FROM AttachTest WHERE ID=1",
RecordsetTypeEnum.dbOpenSnapshot);
Recordset2 rstAttach = rstMain.Fields["Attachments"].Value;
while ((!"Document1.pdf".Equals(rstAttach.Fields["FileName"].Value)) && (!rstAttach.EOF))
{
rstAttach.MoveNext();
}
if (rstAttach.EOF)
{
Console.WriteLine("Not found.");
}
else
{
Field2 fld = (Field2)rstAttach.Fields["FileData"];
fld.SaveToFile(@"C:\Users\Gord\Desktop\FromSaveToFile.pdf");
}
db.Close();
Not Kullandığınız denerseniz Field2 nesnesinin .Value
, hala bayt dizisinin başında meta verileri alacaktır; .SaveToFile
işlemi, onu dışarı çıkaran işlemdir.
// Bu eki alan içinde depolanan bir dosya almak için bilgi parçalarını bir araya biraz zaman aldı
Çok ilginç, böyle bir şey arıyordum ve bulamıyorum. – Steve
Gord, sen adamsın. Teşekkürler. –
Ekler sütunundan bir dizi dosya nasıl çıkarılabilir? –