Кажется, что сортировка массива сначала могла бы быть относительно простым подходом.
я не думаю, что существует единственный корректный способ реализовать это, но здесь является альтернативой, которая добавляет значения к значениям хеша на основе того, соответствуют ли они условию размера или нет, и затем читает получающиеся значения.
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
У меня есть эта та же проблема при попытке получить доступ к файловой системе 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.
}
Я думаю, что необходимо попытаться воспроизвести проблему, и, чем использование пакетный монитор, чтобы видеть сетевой трафик и посмотреть на различие между ситуацией с отказом и ситуацией с успехом.
Затем запишите приложение, которое использует необработанный API из окон (P/Invokes), чтобы воспроизвести Вашу ситуацию с отказом и попытаться найти, какие параметры вызывают ошибку произойти. Если Ваше способное для решения проблемы, чем он - просто вопрос нахождения, как заставить компоненты делать вещь, Вы хотите.
Другие направления, на которые Вы могли посмотреть (после того, как можно устойчиво воспроизвести проблему):
По моему скромному мнению, это, кажется, некоторый побочный эффект обновления аутентификационного маркера с истекшим сроком (или что-то как этот).
Я мой случай, как Пользователь Active Directory, имеющий доступ в Интернет через прокси (сквид), я просматриваю без проблем, пока я не получаю (наугад интервалы) ошибку об отсутствии учетных данных, которые решены обновлением страницы в браузере, затем все хорошо работает до следующей ошибки.