0

の使用などに変換.pptまたはpptx ファイル化するプログラムがあります。pngC#Microsoft.Office.Interop

ほとんどの場合は機能しますが、特定の状況下では、なんらかの理由で特定のファイル名で失敗するようです。

HRESULT E_FAIL at ... Presentations.Open

それは失敗し CT_Stress_Test - Copy (16).pptx、スルーでCT_Stress_Test - Copy (11).pptx機能しますが、これら2つだけで失敗します。私の質問はなぜですか?(2)(19)

これらのコピーをコピーしたり、別の名前に変更したりすると、問題なく変換されるので、ファイル名に関係があるのではないかと思います。

サーバーとローカル マシンで同じ変換プログラムを実行しています。私のローカル マシン (Win 7) は、問題のファイルを単にファイルに変換します。これら 2 つのファイル名に問題があるのは、サーバー (Win 2008) だけです。

編集:機能しない別の番号を見つけました:(38)

編集:文字列をPath関数でフォーマットしましたが、役に立ちませんでした。

編集:ファイル名からすべてのスペースを削除することで修正できました。それでも、なぜこれが起こるのか知りたいです。

プログラムは次のとおりです。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;
using Microsoft.Office.Core;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using System.Diagnostics;
using System.Timers;
using System.Security.Permissions;
using System.Collections.Concurrent;


namespace converter
{
    class Program
    {
        public static int threadLimit=0;
        public static string inDir;
        public static string outDir;
        public static string procDir;
        public static Thread[] converterThreads;
        public static BlockingCollection<string> todo;
        static void Main(string[] args)
        {
            todo = new BlockingCollection<string>();
            inDir = args[0];
            outDir = args[1]+"\\";
            procDir = args[2]+"\\";
            Int32.TryParse(args[3],out threadLimit);
            converterThreads = new Thread[threadLimit];

            FileSystemWatcher watcher = new FileSystemWatcher(inDir); //Watcher "thread"
            watcher.Filter = "*.ppt*";
            watcher.NotifyFilter = watcher.NotifyFilter | NotifyFilters.CreationTime;
            watcher.IncludeSubdirectories = false;
            watcher.Created += new FileSystemEventHandler(fileChanged); 
            watcher.EnableRaisingEvents = true;


            //Create consumer threads
            for(var i=0;i<threadLimit;i++)
            {
                Conversion con = new Conversion();
                converterThreads[i] = new Thread(new ThreadStart(con.watchCollection));
                converterThreads[i].Start();
            }


            //stay open
            Console.ReadLine();
        }

        //Producer
        private static void fileChanged(object sender, FileSystemEventArgs e)
        {
            if(!(e.FullPath.Contains("~$"))){ //Ignore temp files
                Console.WriteLine("found =" + e.FullPath);
                todo.Add(e.FullPath);
            }
        }
    }



    class Logger{

        static void toLog(String msg)    
        {
                //TODO: log file    
        }

    }




    //Consumer
    class Conversion
    {
        String input;
        String output;
        String outDir;
        String process;
        String nameWith;
        String nameWithout;
        string dir;
        static List<CorruptFile> cFiles = new List<CorruptFile>();
        int retryLimit = 20;

        public Conversion()
        {
            this.outDir = Program.outDir;
            this.process = Program.procDir;
        }

        //Continually watches collection for files to take.
        public void watchCollection()
        {
            while (true)
            {
                System.Threading.Thread.Sleep(1000);
                try
                {
                    dir = Program.todo.Take();
                    if (dir != null)
                    {
                        this.nameWithout = Path.GetFileNameWithoutExtension(dir);
                        this.nameWith = Path.GetFileName(dir);
                        this.output = Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(dir);
                        Console.WriteLine("output = " + this.output);
                        this.input = Path.GetFullPath(dir);
                        Console.WriteLine("thread took " + this.nameWith);
                        convertPpt();
                    }
                }
                catch (InvalidOperationException) { }
            }
        }

        public void convertPpt()
        {
            try
            {
                var app = new PowerPoint.Application();
                var pres = app.Presentations;
                var file = pres.Open(input, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
                file.SaveAs(output, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsPNG, MsoTriState.msoTrue);
                file.Close();
                app.Quit();
                Console.WriteLine("file converted " + input);
                moveFile();
            }
            catch (Exception e)
            {
                Console.WriteLine("convertPpt failed " + e);
                try
                {
                    foreach (Process proc in Process.GetProcessesByName("POWERPNT"))
                    {
                        proc.Kill();
                        Console.WriteLine("process killed");
                    }
                }
                catch (Exception e3)
                {
                }

                try
                {
                    if (!(cFiles.Any(x => x.fileName == dir)))
                    {
                        cFiles.Add(new CorruptFile(dir));
                        Console.WriteLine("file added to watch list");
                        Program.todo.Add(dir);
                    }
                    else
                    {
                        var found = cFiles.Find(x => x.fileName == dir);
                        Console.WriteLine("in watch list = " + found.fileName);
                        if (found.numRetry >= retryLimit)
                        {
                            Console.WriteLine(nameWith+ " to be ignored");
                            try
                            {
                                cFiles.Remove(found);
                                Console.WriteLine("File ignored");
                                System.Threading.Thread.Sleep(300);
                                Console.WriteLine("Moving: " + input);
                                if (File.Exists("C:\\corrupt\\" + nameWith))
                                {
                                    File.Replace(input, "C:\\corrupt\\" + nameWith, null);
                                    Console.WriteLine("file moved to C:\\corrupt\\");
                                }
                                else
                                {
                                    File.Move(input, "C:\\corrupt\\" + nameWith);
                                    Console.WriteLine("file moved to C:\\corrupt\\");
                                }
                            }
                            catch(Exception e5)
                            {
                                Console.WriteLine("could not move file " + e5);
                            }
                        }
                        else
                        {
                            Console.WriteLine("retrying file on watch list");
                            found.numRetry++;
                            Program.todo.Add(dir);
                        }
                    }
                }
                catch { }


            }

            moveDir();
        }
        public void moveFile()
        {
            Console.WriteLine("moving" + input);
            try
            {
                System.Threading.Thread.Sleep(500);
                Console.WriteLine(string.Format("moving {0} to {1}", input, process + nameWith));
                if (File.Exists(process + nameWith))
                {
                    File.Replace(input, process + nameWith, null);
                }
                else
                {
                    File.Move(input, process + nameWith);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(string.Format("Unable to move the file {0} ", input) + e);
                try
                {
                    foreach (Process proc in Process.GetProcessesByName("POWERPNT"))
                    {
                        proc.Kill();
                    }
                }
                catch (Exception e3)
                {
                }
            }
        }

        public void moveDir()
        {
            if(!Directory.Exists(output)){
                return;
            }

            Console.WriteLine("moving dir " + output);
            try
            {
                Console.WriteLine(string.Format("moving dir {0} to {1} ", output, outDir + nameWithout));

                if (Directory.Exists(outDir + nameWithout))
                {
                    Directory.Delete(outDir + nameWithout, true);
                }
                if (Directory.Exists(output))
                {
                    Directory.Move(output, outDir + nameWithout);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(string.Format("Unable to move the directory {0} ", output) + e);
                try
                {
                    foreach (Process proc in Process.GetProcessesByName("POWERPNT"))
                    {
                        proc.Kill();
                    }
                }
                catch (Exception e3)
                {
                }
            }
        }
    }

    class CorruptFile{
        public string fileName;
        public int numRetry;

       public CorruptFile(string fn){
            fileName = fn;
        }
    }
}
4

1 に答える 1