Простой доступ к сетевому диску в C#

У меня возникла ситуация, когда мне нужно получить доступ к сетевому диску на С#, но буквы дисков могут быть разными на каждой машине, на которой будет работать мое приложение.

Например: на моем компьютере для разработки буква сетевого диска выглядит так: M:\engineering\testerdata\configfile.txt

Но на машинах производственного тестового стенда буква диска может быть разной на каждой машине в зависимости от того, как их настроил наш ИТ-отдел. В этих случаях могут быть некоторые машины с G:\engineering\testerdata\configfile.txt и другие с L:\engineering\testerdata\configfile. .txt. В любом случае данные будут находиться на сетевом диске в папке \engineering\testerdata\configfile.txt.

Я пытаюсь написать метод, который будет обращаться к этой сетевой папке для чтения файла конфигурации. Мне не нужно беспокоиться об учетных данных, потому что они уже настроены на каждой машине. Кроме того, я не хочу, чтобы это был локальный рабочий каталог, так как мне пришлось бы вручную изменять настройки примерно на 20 ПК. Вот как выглядит мой метод.

public string DatabaseSelector()
    {
      //This method determines which database to use when reading     configuration data.  If the file does not exist, default to AX.
        string DataBaseToUse = "AX";  //This is the default database
        string DatabasetoUsePath = "\\\\engineering\\testerdata\\configfile.txt";
        StreamReader DBtoUseReader = new StreamReader(DatabasetoUsePath);

        if (File.Exists(DatabasetoUsePath))  // if file exists, read file to determine which database to use.
        {
            DataBaseToUse = DBtoUseReader.ReadToEnd();   // Set to what's in the file.  Will be AX or MACPAC
            if (DataBaseToUse == "MACPAC")  
                return DataBaseToUse;  //Done - using MACPAC
            else
                return "AX";  // regardless of anything else, use AX
        }
       return DataBaseToUse;  // if file doesn't exist, us AX.
    }  // end DatabaseSelector

Я всегда получаю исключение "Необработанное исключение типа "System.IO.IOException" произошло в mscorlib.dll
Дополнительная информация: не удается найти сетевое имя".

Для строки DatabasetoUsePath я также пробовал @"\\engineering\testerdata\configfile.txt"; и "\engineering\testerdata\configfile.txt"; Который не будет даже при компиляции я получаю сообщение «Нераспознанная escape-последовательность».

Я думал, что это будет легко реализовать, учитывая, что я сделал что-то очень похожее для чтения локального файла на диске C:, но чтение с сетевого диска оказалось сложнее, чем я думал! Что я делаю не так? Заранее спасибо!


person MTH    schedule 21.02.2015    source источник
comment
Ну, M:\engineering\testerdata\configfile.txt относится к папке engineering под тем, на что сопоставляется M:. В вашем примере универсального соглашения об именах (UNC) \\engineering\testerdata\configfile.txt я думаю, что он ищет хост с именем engineering, которого, как я полагаю, не существует. Что именно соответствует M:? Вы должны иметь возможность просто использовать UNC, а не не подключенные диски - это обходит M: и G:   -  person MickyD    schedule 21.02.2015
comment
M: и G: обозначают буквы дисков на разных машинах. Я пытаюсь обойти использование букв дисков, так как я не знаю, что это такое. Данные, которые я пытаюсь получить, находятся в папке \\engineering\testerdata.   -  person MTH    schedule 21.02.2015
comment
Хм, я запутался - На моем компьютере для разработки буква сетевого диска выглядит так: M:\engineering\testerdata\configfile.txt - Не M: и G: представляют сеть сопоставленную диски? Просто используйте UNC. не вижу в чем проблема к сожалению   -  person MickyD    schedule 21.02.2015
comment
В порядке. Я думаю, мне нужно прочитать и понять, что означает UNC. Я впервые об этом слышу. Спасибо.   -  person MTH    schedule 21.02.2015
comment
Думали ли вы, что сообщение об исключении может точно сказать, что не так? Что путь к файлу, переданный File.Exists, действительно не существует? Просто попробуйте открыть путь UNC, который вы передаете File.Exists, в окне проводника Windows и посмотрите, найдено что-то или нет.   -  person stakx - no longer contributing    schedule 21.02.2015
comment
Я на 100% уверен, что путь правильный и файл существует.   -  person MTH    schedule 21.02.2015
comment
Должен любить отрицательный голос за вопрос.   -  person MTH    schedule 21.02.2015
comment
Почему это помечено как ibm-midrange?   -  person Charles    schedule 22.02.2015
comment
Я пометил IBM-midrange, потому что в зависимости от того, что будет прочитано в файле, я буду подключаться к базе данных AS-400 или базе данных AX SQL.   -  person MTH    schedule 23.02.2015


Ответы (2)


Взгляните на сопоставление и используйте имя канонического файла (я думаю, оно так и называется) вместо этого. Например, у меня есть диск, сопоставленный с I, но на самом деле это

\\DC1\applications\

обычно я бы обращался к этому через I:\ Вы можете получить эту информацию из проводника, в моем случае это действительно показывает, что I:\ действительно \DC1\applications

Это означало бы, что если есть такая вещь, как I:\engineering, вы должны обращаться к ней как \DC1\applications\engineering.

Чтобы просмотреть сопоставление, щелкните правой кнопкой мыши кнопку «Пуск» и выберите «Открыть проводник Windows». Отображение отображается слева под узлом компьютера. Предполагая, что у вас уже есть эти сопоставления.

введите здесь описание изображения

См. в этом примере диск Y сопоставлен с

\\Storage\public

Диск C — это локальный диск, так же как и D, E — это DVD, F — это тоже диск, …

person Philip Stuyck    schedule 21.02.2015
comment
Хотя это хороший ответ, рассмотрите возможность настройки вашего примера в соответствии с путем OP (ну, в любом случае, часть после имени хоста) :) - person MickyD; 21.02.2015
comment
Принял во внимание ваш совет и немного изменил свой ответ. Полезный комментарий. - person Philip Stuyck; 21.02.2015
comment
Полный путь на моей машине: M:\\GVR-ARRAY02\engineering\testerdata\configfile.txt. Когда я кодирую его как таковой, он все равно не находит файл в сети. Я не уверен, почему у меня такие трудные времена с этим. - person MTH; 21.02.2015
comment
Вопрос в том, что такое M:\, щелкните правой кнопкой мыши кнопку «Пуск» и выберите проводник Windows, откройте узел компьютера и посмотрите, что появляется внизу. Unc должен появиться. - person Philip Stuyck; 21.02.2015
comment
Обновлен мой ответ с учетом того, что дает проводник на моем компьютере, на котором также есть сетевой диск. - person Philip Stuyck; 21.02.2015
comment
Итак, удалось ли вам узнать необходимую информацию? Пожалуйста, отметьте меня как ответ, если вы были. - person Philip Stuyck; 22.02.2015
comment
@MTH Все говорят, что M:\ - это просто псевдоним для реального пути объекта (UNC). Если вы используете фактический UNC, вам вообще не нужен M:\. Буквы дисков на самом деле не нужны для многих ссылок. - person user2338816; 22.02.2015
comment
@PhillipStuyck, думаю, получилось! Я читал сетевой диск как просто «хранилище», чтобы использовать приведенный выше пример. Я добавил \\Storage\Public или в моем случае \\Enginering\Share\\testerdata\configfile.txt. Я не понял, как получить доступ к папке. Спасибо за вашу помощь. - person MTH; 23.02.2015

Вы захотите использовать пути UNC: \\fqdn\sharename\PathToFile

person Matt Hanson    schedule 21.02.2015