Запись в папку appdata - проблема с разрешением? - PullRequest
1 голос
/ 25 октября 2011

У меня было несколько ответов на похожие вопросы, но они мне особо не помогли.

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

У меня есть вспомогательный класс, который, помимо прочего, возвращает подпапку appdata и resources следующим образом:

class Folders
{
    static public String GetUserFolder()
    {
        return Application.LocalUserAppDataPath;
    }

    static public String GetResourcesFolder()
    {
        // If the resources folder does not exist then create it
        String userFolder = GetUserFolder();
        String resourcesFolder = userFolder + "\\Resources";

        if (!Directory.Exists(resourcesFolder))
        {
            Directory.CreateDirectory(resourcesFolder);
        }
        return resourcesFolder;
    }

    ...

Итак, мой код вызывает метод GetResourcesFolder, который возвращает путь (создает папку в процессе, если это необходимо), проверяет, существует ли файл и не пытается ли он записать в него что-то вроде:

        String filename = Helpers.IO.Folders.GetResourcesFolder() + "\\data.dat";
        FileStream outFile = System.IO.File.OpenWrite(filename);

Итак, я установил сцену, и этот код работает на всех машинах, которые были у меня в офисе разработчиков. Тем не менее, несколько коллег за пределами сайта жаловались, что они «зависают» на их машинах - в каждом случае машина XP - но в остальном не очень много полезной информации, получаемой от них, - пытаясь получить от них что-то более информативное. У меня в офисе есть машины с ХР, на которых он работал без проблем.

После того, как я выкопал несколько действительно старых машин, которые были "заархивированы" некоторое время назад, мне также удалось получить сбой на двух машинах xp (sp2). В обоих случаях сбой, по-видимому, связан с разрешениями на запись, и запуск приложения с помощью «Запуск от имени ...» решил проблему, и она работает правильно. Однако после успешного запуска приложения, когда оно перестает работать, даже если я удалю созданные им файлы / папки из папки appdata, оно все равно будет успешно создано при последующих выполнениях, даже если я не буду повышать разрешения.

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

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

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

Один из способов действий - создать виртуальную машину с XP. Вы можете сохранить состояние машины перед установкой для тестирования. После установки просто вернитесь в предыдущее состояние, чтобы проверить снова. Есть несколько поставщиков с бесплатными виртуальными машинами:

http://www.microsoft.com/windows/virtual-pc/

https://www.virtualbox.org/

Как и сама связанная с этим проблема, я не знаю лучшего способа, чем установить VS на виртуальную машину для целей тестирования.

0 голосов
/ 25 октября 2011

+ 1 к решениям Эрика для виртуальных машин, чтобы сообщить о проблеме.

Для отслеживания проблем с разрешениями рассмотрите возможность использования ProcMon (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) - покажет все, что вы когда-либо хотели (и не :)) о доступе к файлу / реестру, сделанному процессом. Я бы порекомендовал сначала попробовать это несколько раз на компьютере, где ваша программа работает нормально, чтобы настроить фильтрацию для вашего процесса и понять, что должно происходить.

...