Forum: ASP.NET |
Thema:
Dokument wieder freigeben |
Von:
Gerald Weibl (
27.08.2004 09:53) |
Hallo!
Ich verwende die dsofile.dll um mir Custom Properties von Office Dokumenten anzeigen zu lassen. Das funktioniert einwandfrei. Nur wenn ich die Seite aktualisiere bekomme ich eine Fehlermeldung.
Ich zeig euch mal den Code den ich verwende:
[CODE]
protected System.Web.UI.WebControls.Table myTable;
protected DSOleFile.CustomProperties custProps;
protected DSOleFile.PropertyReader objPropReader;
protected DSOleFile.DocumentProperties objDocumentProps;
private void Page_Load(object sender, System.EventArgs e)
{
try
{
string strDirectory = @"c:\temp";
objPropReader = new DSOleFile.PropertyReaderClass();
ArrayList arrListDocumentFullName = new ArrayList();
ArrayList arrListDocumentName = new ArrayList();
DirectoryInfo di = new DirectoryInfo(strDirectory);
FileInfo[] rgFiles = di.GetFiles("*.doc");
foreach(FileInfo objFileInfo in rgFiles)
{
System.IO.FileAttributes objAttrFile = System.IO.File.GetAttributes(objFileInfo.FullName);
if ((objAttrFile & (System.IO.FileAttributes.Hidden | System.IO.FileAttributes.System)) != 0)
{
Response.Write(objFileInfo.Name + ": Hidden Datei<br>");
}
else
{
arrListDocumentFullName.Add(objFileInfo.FullName);
arrListDocumentName.Add(objFileInfo.Name);
}
}
int intPropCount = 0;
object[] objIndex;
string strSharePath = @"\\wlcomgtd\temp\";
string strFileName = "";
string strValue = "";
for(int i = 0; i < arrListDocumentFullName.Count; i++)
{
strFileName = arrListDocumentFullName[i].ToString();
objDocumentProps = objPropReader.GetDocumentProperties(strFileName);
System.Runtime.InteropServices.Marshal.ReleaseComObject(objPropReader);
objPropReader = null;
intPropCount = objDocumentProps.CustomProperties.Count;
objIndex = new object[intPropCount];
object obj = null;
TableRow row = new TableRow();
TableCell cellName = new TableCell();
cellName.Text = "<a href =" + strSharePath + arrListDocumentName[i].ToString() + ">" + arrListDocumentName[i].ToString() + "</a>";
cellName.RowSpan = 2;
cellName.BackColor = Color.White;
row.Cells.Add(cellName);
for(int a = 1; a < intPropCount+1; a++)
{
obj = a;
objIndex[a-1] = objDocumentProps.CustomProperties[obj].Name;
TableCell cellPropName = new TableCell();
cellPropName.Text = objDocumentProps.CustomProperties[obj].Name;
row.Controls.Add(cellPropName);
}
row.BackColor = Color.LightGray;
myTable.Rows.Add(row);
TableRow row1 = new TableRow();
for(int y = 0; y < intPropCount; y++)
{
// strValue = "Nicht vorhanden";
custProps = objDocumentProps.CustomProperties;
strValue = objDocumentProps.CustomProperties[objIndex[y]].get_Value().ToString();
TableCell cell2 = new TableCell();
cell2.Text = strValue;
row1.Cells.Add(cell2);
}
myTable.Rows.Add(row1);
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(objDocumentProps);
objDocumentProps = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
catch(System.Runtime.InteropServices.COMException ex)
{
Response.Write(ex.ToString());
}
}
[/CODE]
Und hier die Fehlermeldung wenn ich auf aktualisieren klicke:
System.Runtime.InteropServices.COMException (0x80030020): Freigabeverletzung aufgetreten at DSOleFile.PropertyReaderClass.GetDocumentProperties(String sFileName) at Documentproperties.WebForm1.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\documentproperties\webform1.aspx.cs:line 65
Und zwar lockt der Prozess aspnet_wp.exe die Dokumente. Wenn ich den Prozess beende dann kann ich das Dokument wieder öffnen.
Wie kann ich das nun implementieren dass nachdem die Properties eines Dokumentes ausgelesen wurden das Dokument wieder freigegeben wird?
Hoffe ihr könnt mir helfen.
Danke, Gerald.
Antworten
Vorsicht bei der Eingabe: Die Zeichen ' oder -- sind nicht erlaubt!