// 안녕하세요, 그래서 난 그냥 아이디 공유에게 그것을 생각했다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
using System.Diagnostics;
namespace AttachCheck
{
public partial class Form1 : Form
{
DataSet Set1 = new DataSet();
int ColId;
public Form1()
{
InitializeComponent();
OleDbConnection connect = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='db/Adb.accdb'"); //set up connection
//CL_ID is a fk so attachments can be linked to users
OleDbCommand sql = new OleDbCommand("SELECT at_ID, [at_Name].[FileData], [at_Name].[FileName], [at_Name].[FileType] FROM Attachments WHERE at_ID =1;", connect);
//adding sql to addapter to be ran
OleDbDataAdapter OleDA = new OleDbDataAdapter(sql);
//attempting to open connection
try { connect.Open(); }
catch (Exception err) { System.Console.WriteLine(err); }
OleDA.Fill(Set1); //create and fill dataset
connect.Close();for (int i = 0; i < Set1.Tables[0].Rows.Count; i++)
{
System.Console.WriteLine(Set1.Tables[0].Rows[i]["at_Name.FileName"].ToString() + "This is the file name");
// by using a datagrid it allows you to display the attachments and select which to open, the open should be a button.
dataGridView1.Rows.Add(new object[] { Set1.Tables[0].Rows[i]["at_ID"].ToString(), Set1.Tables[0].Rows[i]["at_Name.FileName"].ToString(), "Open" });
}
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
DataGridViewCell cell = (DataGridViewCell)
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
System.Console.WriteLine(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]);
string FullRow = dataGridView1.Rows[e.RowIndex].ToString(); //data retrieved from click on datagrid
//need to sub string to cut away row index and leave number
string SubRow = FullRow.Substring(24, 1); //cutting string down from position 24 for 1 character
System.Console.WriteLine(SubRow + " This is Row"); //
int RowId = int.Parse(SubRow); //turn row number from string into integer that can be used
string FullRow2 = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].ToString(); //data retrieved from click on datagrid
//need to sub string to cut away row index and leave number
string SubRow2 = FullRow2.Substring(37, 1); //cutting string down from position 24 for 1 character
System.Console.WriteLine(SubRow2 + " This is Column"); //
int ColId = int.Parse(SubRow2); //turn row number from string into integer that can be used
if (ColId == 2)
{
string fileName = Set1.Tables[0].Rows[RowId]["at_Name.FileName"].ToString(); //assign the file to variable
//retrieving the file contents from the database as an array of bytes
byte[] fileContents = (byte[])Set1.Tables[0].Rows[RowId]["at_Name.FileData"];
fileContents = GetFileContents(fileContents); //send filecontents array to be decrypted
string fileType = Set1.Tables[0].Rows[RowId]["at_Name.FileType"].ToString();
DisplayTempFile(fileName, fileContents, fileType); //forward the file type to display file contents
}
}
private const int CONTENT_START_INDEX_DATA_OFFSET = 0; //values used for decoding
private const int UNKNOWN_DATA_OFFSET = 4; //the files
private const int EXTENSION_LENGTH_DATA_OFFSET = 8; //storedw within the access database
private const int EXTENSION_DATA_OFFSET = 12; //and this one
private byte[] GetFileContents(byte[] fileContents)
{
int contentStartIndex = BitConverter.ToInt32(fileContents, CONTENT_START_INDEX_DATA_OFFSET);
//'The next four bytes represent a value whose meaning is unknown at this stage, although it may represent a Boolean value indicating whether the data is compressed or not.
int unknown = BitConverter.ToInt32(fileContents, UNKNOWN_DATA_OFFSET);
//'The next four bytes contain the the length, in characters, of the file extension.
int extensionLength = BitConverter.ToInt32(fileContents, EXTENSION_LENGTH_DATA_OFFSET);
//'The next field in the header is the file extension, not including a dot but including a null terminator.
//'Characters are Unicode so double the character count to get the byte count.
string extension = Encoding.Unicode.GetString(fileContents, EXTENSION_DATA_OFFSET, extensionLength * 2);
return fileContents.Skip(contentStartIndex).ToArray();
}
private void DisplayTempFile(string fileName, byte[] fileContents, string fileType)
{
// System.Console.WriteLine(fileName + "File Name");
// System.Console.WriteLine(fileType + "File Type");
// System.Console.WriteLine(fileContents + "File Contents");
string tempFolderPath = Path.GetTempPath(); //creating a temperary path for file to be opened from
string tempFilePath = Path.Combine(tempFolderPath, fileName); // assigning the file to the path
if (!string.IsNullOrEmpty(tempFilePath)) //checking the temp file exists
{
tempFilePath = Path.Combine(tempFolderPath, //combines the strings 0 and 1 below
String.Format("{0}{1}",
Path.GetFileNameWithoutExtension(fileName), //0
Path.GetExtension(fileName))); //1
}
//System.Console.WriteLine(tempFolderPath + " tempFolderPath");
//System.Console.WriteLine(tempFilePath + " tempFilePath");
//'Save the file and open it.
File.WriteAllBytes(tempFilePath, fileContents);
//creates new file, writes bytes array to it then closes the file
//File.ReadAllBytes(tempFilePath);
//'Open the file.
System.Diagnostics.Process attachmentProcess = Process.Start(tempFilePath);
//chooses the program to open the file if available on the computer
}
}
}
// 희망이 사람
매우 흥미롭고, 나는 이것을 찾아서 찾을 수 없습니다. – Steve
Gord, 너는 남자 야. 감사. –
어떻게 첨부 파일 열에서 파일 배열을 추출 할 수 있습니까? –