Я не уверен, что происходит с этим приложением. Это работало хорошо тогда однажды это прекратило работать. Я пытался исключить отдельные элементы в коде, но как только я добавил несколько перечислений (см. Код ниже), он сломался - поэтому я удалил их, но это не решило проблему. Затем я начал с совершенно новой службы win (с использованием VS2010 и VS2008), добавив переменные уровня класса, и еще раз после добавления перечислений служба не запустится.
Вот код, и мне было интересно, может ли кто-нибудь мне помочь. Я действительно ценю это.
using _Mail;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Net.Mail;
using Microsoft.Office.Core;
using Microsoft.Office.Interop.PowerPoint;
using Microsoft.SharePoint;
namespace Uploader
{
public partial class _UploaderService : ServiceBase
{
private static string smtpServer = ConfigurationManager.AppSettings["smtpServer"];
private static string sendTo = ConfigurationManager.AppSettings["sendTo"];
private static string sendFrom = ConfigurationManager.AppSettings["sendFrom"];
private static string portalURL = ConfigurationManager.AppSettings["portalURL"];
private static string imageListFolder = ConfigurationManager.AppSettings["imageListFolder"];
private static string remFolder = ConfigurationManager.AppSettings["remoteFolder"];
private static string sourceFileName = ConfigurationManager.AppSettings["sourceFileName"];
private static string remoteDriveLetter = ConfigurationManager.AppSettings["remoteDriveLetter"];
private static string remoteShareName = ConfigurationManager.AppSettings["remoteShareName"];
private static string userName = ConfigurationManager.AppSettings["userName"];
private static string userPwd = ConfigurationManager.AppSettings["userPwd"];
private static string statusMessage;
private static string[] files;
private static SPWeb _Web = new SPSite(portalURL).OpenWeb();
private static NETRESOURCE res = new NETRESOURCE();
public enum ResourceScope
{
RESOURCE_CONNECTED = 1,
RESOURCE_GLOBALNET,
RESOURCE_REMEMBERED,
RESOURCE_RECENT,
RESOURCE_CONTEXT
};
public enum ResourceType
{
RESOURCETYPE_ANY,
RESOURCETYPE_DISK,
RESOURCETYPE_PRINT,
RESOURCETYPE_RESERVED
};
public enum ResourceUsage
{
RESOURCEUSAGE_CONNECTABLE = 0x00000001,
RESOURCEUSAGE_CONTAINER = 0x00000002,
RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
RESOURCEUSAGE_SIBLING = 0x00000008,
RESOURCEUSAGE_ATTACHED = 0x00000010
};
public enum ResourceDisplayType
{
RESOURCEDISPLAYTYPE_GENERIC,
RESOURCEDISPLAYTYPE_DOMAIN,
RESOURCEDISPLAYTYPE_SERVER,
RESOURCEDISPLAYTYPE_SHARE,
RESOURCEDISPLAYTYPE_FILE,
RESOURCEDISPLAYTYPE_GROUP,
RESOURCEDISPLAYTYPE_NETWORK,
RESOURCEDISPLAYTYPE_ROOT,
RESOURCEDISPLAYTYPE_SHAREADMIN,
RESOURCEDISPLAYTYPE_DIRECTORY,
RESOURCEDISPLAYTYPE_TREE,
RESOURCEDISPLAYTYPE_NDSCONTAINER
};
[StructLayout(LayoutKind.Sequential)]
public struct NETRESOURCE
{
public ResourceScope dwScope;
public ResourceType dwType;
public ResourceDisplayType dwDisplayType;
public ResourceUsage dwUsage;
public string lpLocalName;
public string lpRemoteName;
public string lpComment;
public string lpProvider;
};
[DllImport("mpr.dll")]
public static extern int WNetAddConnection2(ref NETRESOURCE
netResource, string password, string username, int flags);
public cisf_UploaderService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
FileSystemWatcher fsWatcher = new FileSystemWatcher();
fsWatcher.Created += new FileSystemEventHandler(fsw_Created);
DisconnectDrive(remoteDriveLetter);
res.dwType = ResourceType.RESOURCETYPE_DISK;
res.lpLocalName = remoteDriveLetter;
res.lpRemoteName = remoteShareName;
int stat = WNetAddConnection2(ref res, null, null, 0);
statusMessage += "Map Network Drive status - " + stat + ".";
//MapDrive();
CleanUp();
fsWatcher.Path = remFolder;
fsWatcher.Filter = sourceFileName;
fsWatcher.EnableRaisingEvents = true;
}
catch (Exception ex1)
{
WriteException(ex1,"Ex1");
}
}
protected override void OnStop()
{
}
static void fsw_Created(object sender, FileSystemEventArgs e)
{
statusMessage += "\nNew PowerPoint file detected in directory.";
ConvetToJpegs();
AcquireFiles();
CleanUp();
DisconnectDrive(remoteDriveLetter);
statusMessage += "\nOperation sucessfuly completed.";
EventLog.WriteEntry("Conversion Service Status", statusMessage, EventLogEntryType.Information);
}
protected static void ConvetToJpegs()
{
Microsoft.Office.Interop.PowerPoint.Application app = new Microsoft.Office.Interop.PowerPoint.Application();
Presentation pptPresentation = null;
try
{
pptPresentation = app.Presentations.Open(remFolder + sourceFileName, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
pptPresentation.SaveAs(remFolder + ".", PpSaveAsFileType.ppSaveAsJPG, MsoTriState.msoFalse);
}
catch (Exception ex2)
{
WriteException(ex2, "Ex2");
}
finally
{
pptPresentation.Close();
statusMessage += "\nFile conversion completed.";
}
}
protected static void AcquireFiles()
{
files = null;
try
{
files = Directory.GetFiles(remFolder, "*.jpg");
}
catch (Exception ex3)
{
WriteException(ex3, "Ex3");
}
finally
{
statusMessage += "\nFiles acquired.";
if (files.Length > 0)
{
DeleteOldSlides();
}
}
}
protected static void DeleteOldSlides()
{
SPList imagesLibrary = _Web.Lists[imageListFolder];
_Web.AllowUnsafeUpdates = true;
try
{
while (imagesLibrary.Items.Count > 1)
{
imagesLibrary.Items[imagesLibrary.Items.Count - 1].File.Delete();
}
}
catch (Exception ex4)
{
WriteException(ex4, "Ex4");
}
finally
{
statusMessage += "\nOld slides deleted.";
UploadToSharePoint();
}
}
protected static void UploadToSharePoint()
{
_Web.AllowUnsafeUpdates = true;
FileStream fs = null;
string fileName = string.Empty;
try
{
foreach (string file in files)
{
fileName = file.Split(@"\".ToCharArray())[1].ToLower();
fs = File.Open(file, FileMode.Open);
_Web.Files.Add(imageListFolder + "/" + fileName, fs, true);
fileName = string.Empty;
fs.Close();
}
}
catch (Exception ex5)
{
WriteException(ex5, fileName);
}
finally
{
statusMessage += "\nFiles uploaded to SharePoint.";
_Web.AllowUnsafeUpdates = false;
}
}
protected static void CleanUp()
{
string[] path = Directory.GetFiles(remFolder, "*.jpg");
string[] path1 = Directory.GetFiles(remFolder, "*.pptx");
try
{
foreach (string tempfiles in path1)
{
if (path != null)
{
File.Delete(tempfiles);
}
}
foreach (string tempfiles in path)
{
if (path != null)
{
File.Delete(tempfiles);
}
}
}
catch (Exception ex6)
{
WriteException(ex6, "Ex6");
}
finally
{
statusMessage += "\nFiles deleted from temporary directory " + remoteShareName ;
}
}
//public static bool MapDrive()
//{
// bool ReturnValue = false;
// if (System.IO.Directory.Exists(remoteDriveLetter + ":\\"))
// {
// DisconnectDrive(remoteDriveLetter);
// }
// System.Diagnostics.Process p = new System.Diagnostics.Process();
// p.StartInfo.UseShellExecute = false;
// p.StartInfo.CreateNoWindow = true;
// p.StartInfo.RedirectStandardError = true;
// p.StartInfo.RedirectStandardOutput = true;
// p.StartInfo.FileName = "net.exe";
// p.StartInfo.Arguments = " use " + remoteDriveLetter + ": " + remoteShareName + " " + userPwd + " /user:" + userName;
// p.Start();
// p.WaitForExit();
// string ErrorMessage = p.StandardError.ReadToEnd();
// string OuputMessage = p.StandardOutput.ReadToEnd();
// if (ErrorMessage.Length > 0)
// {
// throw new Exception("Error:" + ErrorMessage);
// } else { ReturnValue = true; } return ReturnValue; }
protected static void DisconnectDrive(string DriveLetter)
{
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
try
{
p.StartInfo.FileName = "net.exe";
p.StartInfo.Arguments = " use " + "Z" + ": /DELETE";
p.Start();
}
catch (Exception ex7)
{
WriteException(ex7, "Ex7");
}
finally
{
p.WaitForExit();
}
}
public static void WriteException(Exception ex, string source)
{
string err = "Uploader Error" +
"\n\nError Message from method " + source + ": " + ex.Message.ToString() +
"\n\nStack Trace: " + ex.StackTrace.ToString() + "\n";
EventLog.WriteEntry("Conversion Service", err, EventLogEntryType.Warning);
_Mail sendEmail = new _Mail();
sendEmail.SMTPServer = smtpServer;
sendEmail.MailTo = sendTo;
sendEmail.MailFrom = sendFrom;
sendEmail.MailSubject = "Uploader Error";
sendEmail.MailBody = err;
sendEmail.Send();
}
}
}