Можно ли объяснить почему DirectoryInfo. GetFiles производит этот IOException?

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

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

def size_splitter(array, size)
  array.sort.each_with_object({true => [], false => []}) do |string, hash| 
    hash[string.size == size] << string
  end.values
end

Это также довольно читаемо:

def size_splitter(array, size)
  [
    array.select{|string| string.size == size}.sort,
    array.reject{|string| string.size == size}.sort
  ]
end
13
задан casperOne 24 February 2009 в 19:52
поделиться

3 ответа

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

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

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Security.Principal;

namespace Company.Security
{
    public class ImpersonateUser : IDisposable
    {
        [DllImport("advapi32.dll", SetLastError=true)]
        private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);

        [DllImport( "kernel32", SetLastError = true )]
        private static extern bool CloseHandle(IntPtr hObject);

        private IntPtr userHandle = IntPtr.Zero;
        private WindowsImpersonationContext impersonationContext;

        public ImpersonateUser( string user, string domain, string password )
        {
            if ( ! string.IsNullOrEmpty( user ) )
            {
                // Call LogonUser to get a token for the user
                bool loggedOn = LogonUser( user, domain, password,
                    9 /*(int)LogonType.LOGON32_LOGON_NEW_CREDENTIALS*/,
                    3 /*(int)LogonProvider.LOGON32_PROVIDER_WINNT50*/,
                    out userHandle );
                if ( !loggedOn )
                    throw new Win32Exception( Marshal.GetLastWin32Error() );

                // Begin impersonating the user
                impersonationContext = WindowsIdentity.Impersonate( userHandle );
            }
        }

        public void Dispose()
        {
            if ( userHandle != IntPtr.Zero )
                CloseHandle( userHandle );
            if ( impersonationContext != null )
                impersonationContext.Undo();
        }
    }
}

Затем можно получить доступ к удаленному серверу путем выполнения этого:

using ( new ImpersonateUser( "UserID", "Domain", "Password" ) )
{
    // Any IO code within this block will be able to access the remote server.
}
45
ответ дан 1 December 2019 в 17:40
поделиться

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

Затем запишите приложение, которое использует необработанный API из окон (P/Invokes), чтобы воспроизвести Вашу ситуацию с отказом и попытаться найти, какие параметры вызывают ошибку произойти. Если Ваше способное для решения проблемы, чем он - просто вопрос нахождения, как заставить компоненты делать вещь, Вы хотите.

Другие направления, на которые Вы могли посмотреть (после того, как можно устойчиво воспроизвести проблему):

  • Используйте Монитор Процесса, чтобы зарегистрировать все вызовы API и видеть, куда ошибка прибывает из.
  • Примерьте его чистый VM/Machine и попытайтесь воспроизвести его там
  • Отключите вирусный сканер
  • Обновите клиент Novell
1
ответ дан 1 December 2019 в 17:40
поделиться

По моему скромному мнению, это, кажется, некоторый побочный эффект обновления аутентификационного маркера с истекшим сроком (или что-то как этот).

Я мой случай, как Пользователь Active Directory, имеющий доступ в Интернет через прокси (сквид), я просматриваю без проблем, пока я не получаю (наугад интервалы) ошибку об отсутствии учетных данных, которые решены обновлением страницы в браузере, затем все хорошо работает до следующей ошибки.

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

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