Сравните два текстовых файла, но один не существует из-за разрешений - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь сравнить два текстовых файла в задаче сценария в пакете служб SSIS. Оба файла существуют в файловой системе. Оба файла находятся в одном каталоге. Тем не менее, он не существует, потому что настройки разрешений не видят файл.

Код ниже не работает. Я попробовал несколько различных вариантов приведенного ниже кода, и пакет служб SSIS продолжает go пересылку, что в конечном итоге приводит к сбою в последующей задаче файловой системы, поскольку у него нет доступа к файлу.

Я пытаюсь захватить, что файл отсутствует, потому что пакет не имеет доступа к файлу, а не потому, что файл не существует. Первоначально я использовал File.Exists(), но это не сработает, потому что он возвращает false, если файл отсутствует или пакет не имеет к нему доступа.

    string packageName = Dts.Variables["System::PackageName"].Value.ToString();
    string taskName = Dts.Variables["System.TaskName"].Value.ToString();

    string inputFilePath = Dts.Variables["User::inputFilePath"].Value.ToString();
    string processedFilePath = Dts.Variables["User::processedFilePath"].Value.ToString();

    bool blnFilesMatch = true;

    try
    {
        int i = 0, j = 0;

        // Compare the source and processed files to determine if the contents are different.
        using (var f1 = new FileStream(inputFilePath, FileMode.Open))
        using (var f2 = new FileStream(processedFilePath, FileMode.Open))
        {
            do
            {
                i = f1.ReadByte();
                j = f2.ReadByte();

                if (i != j)
                    break;

            } while (i != -1 && j != -1);

            if (i != j)
                blnFilesMatch = false;  // Files Differ
            else
                blnFilesMatch = true;   // Files are the same
        }

        Dts.Variables["User::blnIdenticalFiles"].Value = blnFilesMatch;

        Dts.TaskResult = (int)ScriptResults.Success;
    }
    catch (FileNotFoundException)
    {
        string tempFileName = "temp_" + packageName + ".txt.";
        string tempFilePath = Path.Combine(Path.GetDirectoryName(inputFilePath), tempFileName);

        // A file wasn't found.  Try to create and delete a temp file to determine whether it was because of permissions or if the file just was not present.
        try
        {
            File.Create(tempFilePath);
            File.Delete(tempFilePath);
            Dts.Variables["User::blnIdenticalFiles"].Value = false;
        }
        catch (UnauthorizedAccessException uae)
        {
            // Permissions cannot create the file.
            Dts.Events.FireError(0, packageName + " - " + taskName, uae.Message, string.Empty, 0);
            Dts.TaskResult = (int)ScriptResults.Failure;
        }
    }
    catch (Exception ex)
    {
        Dts.Events.FireError(0, packageName + " - " + taskName, ex.Message, string.Empty, 0);
        Dts.TaskResult = (int)ScriptResults.Failure;
    }
...