Как разрешение значения по умолчанию/относительного пути работает в.NET?

contacts.items() возвращает пары ключ-значение. В вашем случае это будет что-то вроде

(("John", 938477566), ("Jack", 938377264), ("Jill", 947662781))

За исключением того, что в Python 3 это похоже на генератор, а не список. Поэтому вам нужно будет сделать list(contacts.items()), если вы хотите проиндексировать его, что объясняет ваше сообщение об ошибке. Однако, даже если вы сделали list(contacts.items())[0], как обсуждалось выше, вы получите первую пару ключ-значение.

Что вы пытаетесь сделать, это получить значение ключа, если указанный ключ существует, и contacts.get(key, value_if_key_doesnt_exist) сделает это за вас.

contact = 'John'
# we use 0 for the default value because it's falsy,
# but you'd have to ensure that 0 wouldn't naturally occur in your values
# or any other falsy value, for that matter.
details = contacts.get(contact, 0)
if details:
    print('Contact details: {} {}'.format(contact, details))
else:
    print('Contact not found')
7
задан Dan Malkinski 5 November 2008 в 23:43
поделиться

4 ответа

Когда приложение (WinForms) запускает, Environment.CurrentDirectory содержит путь к папке приложения (т.е. папка, которая содержит .exe блок). Используя любое из Диалоговых окон Файла, напр. OpenFileDialog, SaveFileDialog, и т.д. заставит текущий каталог изменяться (если другая папка была выбрана).

При выполнении службы Windows ее содержание папки является C:\Windows\System32, как это - Системная папка, и это - Система (т.е. Операционная система), который на самом деле выполняет службу Windows.

Обратите внимание что, указав относительный путь в большей части System.IO объекты, отступит к использованию Environment.CurrentDirectory свойство.

Как упомянуто, существует несколько способов получить путь сервисного исполняемого файла, с помощью Assembly.GetEntryAssembly() или Assembly.GetExecutingAssembly() и затем использование любого Location свойство или CodeBase свойство (знать, что это - путь к файлу, не каталог, исполняемого файла).

Другая опция состоит в том, чтобы использовать:

`System.IO.Directory.SetCurrentDirectory( System.AppDomain.CurrentDomain.BaseDirectory );`

Выполните вызов в Сервисе OnStart метод, применяя его к целому приложению.

11
ответ дан 6 December 2019 в 08:17
поделиться

Это основано на текущем рабочем каталоге, который может или не может совпасть с, где Ваше приложение находится, особенно, если запущено с другой программы или ярлыка с другим рабочим каталогом.

Вместо твердого кода путь, получите путь к своей программе и используйте его. Можно сделать это с чем-то вроде этого

Assembly ass = Assembly.GetEntryAssembly();
string dir = Path.GetDirectoryName(ass.Location);
string filename = Path.Combine( dir, "CAISLog.csv" );

Это предполагает, что блок записи состоит в том, где Ваш файл. В противном случае можно изменить получение блока для чего-то как;

Assembly ass = Assembly.GetAssembly( typeof( AClassInYourAssembly ) );
9
ответ дан 6 December 2019 в 08:17
поделиться

Можно использовать это для определения пути, который находится в том же пути exe "..\CAISLog.csv". Обратите внимание на то, что двойные точки обращаются к родительскому каталогу того, где когда-либо Ваш .exe находится.

RWendi

-2
ответ дан 6 December 2019 в 08:17
поделиться

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

Если Вы нуждаетесь в том поведении, то заботитесь, чтобы узнать правильный путь самостоятельно и обеспечить полностью определенный путь к операциям файла.

4
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: