1

SSIS 2012 のスクリプト タスク内に次のコードが含まれています。

public void Main()
    {
        string inputDir = (string) Dts.Variables["User::InputDirectory"].Value;
        string CSVFolder = (string) Dts.Variables["User::CSVFolder"].Value;
        string XMLFolder = (string) Dts.Variables["User::XMLFolder"].Value;
        string XLSXFolder = (string) Dts.Variables["User::XLSXFolder"].Value;
        bool isXMLFolderEmpty = (bool) Dts.Variables["User::isXMLFolderEmpty"].Value;
        bool isCSVFolderEmpty = (bool)Dts.Variables["User::isCSVFolderEmpty"].Value;
        bool isXLSXFolderEmpty = (bool)Dts.Variables["User::isXLSXFolderEmpty"].Value;

        string[] fileNames = Directory.GetFiles(@inputDir);
        if (fileNames.Length > 0)
        {
            foreach (string inputFile in fileNames)
            {
                string FileExtension = Path.GetExtension(inputFile);

                if (FileExtension == ".csv")
                {
                    File.Move(inputDir + "\\" + inputFile, CSVFolder + "\\" + inputFile);
                    isCSVFolderEmpty = false;
                }
                else if (FileExtension == ".xlsx")
                {
                    File.Move(inputDir + "\\" + inputFile, XLSXFolder + "\\" + inputFile);
                    isXLSXFolderEmpty = false;
                }
                else if (FileExtension == ".xml")
                {
                    File.Move(inputDir + "\\" + inputFile, XMLFolder + "\\" + inputFile);
                    isXMLFolderEmpty = false;
                }
            }
        }

        Dts.TaskResult = (int)ScriptResults.Success;
    }

ただし、スクリプト タスクを実行すると、次のエラーが表示されます: DTS スクリプト タスクでユーザー コードで例外が発生しました: 呼び出しのターゲットによって例外がスローされました。

誰が何が間違っているのか指摘できますか? 変数名はすべて正しいです。

4

1 に答える 1

1

File.Move が正しくありません

Path.Combineにも興味があるかもしれません。これは、ブラインド文字列連結ルートよりも建物のパスをより適切に処理するためです。

Directory.GetFileが示す

指定されたディレクトリ内のファイルの名前 (パスを含む) を返します

soinputFileはすでに次の形式にC:\ssisdata\so_35605920\Foo.csvなっているため、FileMove への初期パラメーターは単純です。inputFile

そのため、フォルダー パスを inputFile 変数から対象のフォルダー パス (CSV、XML、または XLSX) に変更することが実際の課題になります。怠惰なハックは、inputDir を指定し、新しいディレクトリを使用して string.replace メソッドを呼び出すことです。UNCまたは相対パスに奇妙さがある場合に備えて、おそらくもう少しエレガントなものを使用します。

Path.GetFileNameは、ファイルと拡張子を教えてくれます。その + Path.Combine を使用すると、Move 操作の正しい最終パスが得られます。

Path.Combine(CSVFolder, Path.GetFileName(inputFile));

したがって

File.Move(inputFile, Path.Combine(CSVFolder, Path.GetFileName(inputFile)));

Visual Studio は現時点ではかなり不満なので、提案されたコードに正確さが欠けていることを許してください。

また、try/catch ブロックは、フォルダーが存在すること、ファイルをロックするプロセスがないことなどを確認するためのテストであるため、防御的なコーディングで非常に役立ちます。

于 2016-02-24T16:15:50.270 に答える