0

入力ファイルを FTP サーバーからローカル サーバーにコピーし、多くの処理を行う SSIS ジョブがあります。これらの入力ファイルのサイズはかなり大きく、外部ベンダーがそれらを FTP サーバーにプッシュすると、ファイルの完全な内容を受信するのに約 5 分かかります。

私のパッケージがファイルをコピーするとき; 部分的なファイルをコピーしないようにしたい。つまり、ファイルがまだ FTP サーバーにプッシュされているときにファイルをコピーしたくありません。ファイルをコピーする前にファイルロックをチェックし、ロックがある場合は10分間待ってから再試行することでこれを達成できると思います。ファイルのロックを確認する方法を教えてください。

ありがとう

4

1 に答える 1

0

編集

以下のソリューションでは、ローカル ファイル ロックをチェックしていました。この場合の解決策は、完全なファイルがロードされ、ダウンロードの準備が整った後で、小さなフラグ ファイルを FTP サーバーに投稿するようベンダーに依頼することです。ファイル全体のダウンロードを開始する前に、フラグ ファイルの存在を確認してください。

編集を終了

スクリプト タスクで以下を使用して、ファイルのロックを確認しました。

    public void Main()
    {
        // TODO: Add your code here
        string strTracePath = Dts.Variables["uv_TraceFilePath"].Value.ToString();
        FileInfo fInfo = new FileInfo(strTracePath);
        try
        {
            Dts.Variables["uv_TraceFileSize"].Value = fInfo.Length;
            fInfo.MoveTo(strTracePath + "_old");
            FileInfo fInfoOld = new FileInfo(strTracePath + "_old");
            fInfoOld.MoveTo(strTracePath);

            Dts.Variables["uv_ProcessTraceFile"].Value = true;
        }
        catch
        {
            Dts.Variables["uv_ProcessTraceFile"].Value = false;
        }
        Dts.TaskResult = (int)ScriptResults.Success;
    }

タスクは、名前を変更しながらファイルを (同じフォルダーに) 移動しようとします。これが成功すると、元の名前に戻されます。成功すると、変数が true に設定されます。失敗すると、変数が false に設定されます。このタスクを終えたら、条件付き優先順位制約を使用して次に何をすべきかを決定します。これを機能させるためUsing System.IO;に、スクリプトの先頭に宣言を追加しました。

于 2012-09-19T13:41:19.217 に答える