ricree
그는 물었다 12년 전
246

Lock 파일에 대한 확인 방법?

유지됩니까 여부를 확인할 수 있는 방법을 사용하지 않고 파일 잠겼음을 시도하시겠습니까 / catch 블록?

지금 바로 잡을 수 있는 유일한 방법은 내가 아는 것은 모든 파일을 열고 '시스템드리오리오렉세페시옹'.

JohnFx
그는 11년 전 댓글을 달았습니다
9

이 중 ioexception 이 문제가 될 수 있는 여러 가지 이유로 해임된 잠겨집니다 이외의 파일.

Eric J.
그는 7년 전 댓글을 달았습니다
5

이것은 오래된 질문, 이전의 모든 대답이 불완전하거나 틀린. 난 또 완전한 정답.

amalgamate
그는 5년 전 댓글을 달았습니다
1

이는 이 질문에 대한 답을 그러니까말이야 아니고 있는 그대로 바라보고 있을 수 있지만, 일부 서브셋에 개발자를 위한 이 도움말에서는 이 옵션: 함께 있는 경우 소유하는지 시스템.디아뇨스틱s.프록스 드와이트 포리스트 잠급니다 프로세스를 시작할 수 있습니다 ().

답변 12 개

문제에 직면했을 때, 나는 내가 비슷한 문제가 종료되고 다음 코드:

public bool IsFileLocked(string filePath)
{
    try
    {
        using (File.Open(filePath, FileMode.Open)){}
    }
    catch (IOException e)
    {
        var errorCode = Marshal.GetHRForException(e) & ((1 << 16) - 1);

        return errorCode == 32 || errorCode == 33;
    }

    return false;
}

Soul_Master
kite
그는 7년 전 댓글을 달았습니다
0

sqlite 데이터베이스 (db) 를 사용하는 프로그램 멈춤으로 firefox 떠날 것이라고 너무 나쁜거라 오프닝 그냥 던진 것으로 idfsysobject. 기다리고 있습니다.

jocull
그는 6년 전 댓글을 달았습니다
4

와일드링이 복귀하십시오 거짓값 '와' 사이에 파일을 열 시도가 다시 단속 it up something else? 경쟁 조건 어이!

Dan Revell
그는 6년 전 댓글을 달았습니다
0

이를 통해 hresult 돌아온다면요 수 있는 다른 무엇을 의미합니까? 32 비트 및 33 가지유형의 잠금식 나타내는 어떻게 알았지?

RenniePet
그는 4년 전 댓글을 달았습니다
0

어쩌면 Microsoft 변경되었습니까 해당 웹 페이지를, 지금은 doesn& # 39 로 32tb 또는 오류 코드, t 포함 33.

DixonD
그는 4년 전 댓글을 달았습니다
2

다음 페이지로 도움됐네 @renniepet 더 있어야 합니다. 85%29.aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382%28v = vs. 해당 오류는 ERROR_SHARING_VIOLATION 및 ERROR_LOCK_VIOLATION

BartoszKP
그는 3년 전 댓글을 달았습니다
1

39 의 what& 비교할 경우 일정한 목적을 비트 마스킹과 임무야, 그 결과가? 또한 ',' 직접 '.NET' 에 부작용은요 제니퍼 1세페시옹 HResult 이후 4.5 읽을 수 있습니다.

taiji123
그는 일 년 전 댓글을 달았습니다
0

@BartoszKP 정확히요 및 아싸리오. # 39, & # 39 의 업데이트되도록 here& 컨텐트에서 catch& # 39;; 절: 'const int ERROR_SHARING_VIOLATION = 0x20. const int ERROR_LOCK_VIOLATION 0x21 =; int 오류 코드 = e. HResult &amp. 0x0000FFFF. 오류 코드 = 반품하십시오 ERROR_SHARING_VIOLATION 오류 코드 = error_lock_violation. '

  • 다른 답을 이전 정보를 의존하고 있습니다. 이 번호요 solution.* 나으뇨 제공합니다.

얼마 전 것은 불가능하다는 안정적으로 목록을 가져올 수 있기 때문에 단순히 해당 정보를 추적되도록 프로세스활용 잠금식 파일을 Windows 않았다. [1], [재시작해야 관리자에서는 apiu] 지원할 수 있는 정보는 이제 추적됨. 다시 시작하는 관리자붃 API 를 사용할 수 있는 윈도우 비스타, 윈도우 서버 2008년 ([재시작해야 관리자: 런타임 요구사양에] [2]).

I put 함께 길을 코드 a ',' 필요한 모든 프로세스의 List&lt, 파일 및 되돌려줍니다 Process&gt 않는비즈니스 잠금식 해당 파일.

static public class FileUtil
{
    [StructLayout(LayoutKind.Sequential)]
    struct RM_UNIQUE_PROCESS
    {
        public int dwProcessId;
        public System.Runtime.InteropServices.ComTypes.FILETIME ProcessStartTime;
    }

    const int RmRebootReasonNone = 0;
    const int CCH_RM_MAX_APP_NAME = 255;
    const int CCH_RM_MAX_SVC_NAME = 63;

    enum RM_APP_TYPE
    {
        RmUnknownApp = 0,
        RmMainWindow = 1,
        RmOtherWindow = 2,
        RmService = 3,
        RmExplorer = 4,
        RmConsole = 5,
        RmCritical = 1000
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    struct RM_PROCESS_INFO
    {
        public RM_UNIQUE_PROCESS Process;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCH_RM_MAX_APP_NAME + 1)]
        public string strAppName;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCH_RM_MAX_SVC_NAME + 1)]
        public string strServiceShortName;

        public RM_APP_TYPE ApplicationType;
        public uint AppStatus;
        public uint TSSessionId;
        [MarshalAs(UnmanagedType.Bool)]
        public bool bRestartable;
    }

    [DllImport("rstrtmgr.dll", CharSet = CharSet.Unicode)]
    static extern int RmRegisterResources(uint pSessionHandle,
                                          UInt32 nFiles,
                                          string[] rgsFilenames,
                                          UInt32 nApplications,
                                          [In] RM_UNIQUE_PROCESS[] rgApplications,
                                          UInt32 nServices,
                                          string[] rgsServiceNames);

    [DllImport("rstrtmgr.dll", CharSet = CharSet.Auto)]
    static extern int RmStartSession(out uint pSessionHandle, int dwSessionFlags, string strSessionKey);

    [DllImport("rstrtmgr.dll")]
    static extern int RmEndSession(uint pSessionHandle);

    [DllImport("rstrtmgr.dll")]
    static extern int RmGetList(uint dwSessionHandle,
                                out uint pnProcInfoNeeded,
                                ref uint pnProcInfo,
                                [In, Out] RM_PROCESS_INFO[] rgAffectedApps,
                                ref uint lpdwRebootReasons);

    /// <summary>
    /// Find out what process(es) have a lock on the specified file.
    /// </summary>
    /// <param name="path">Path of the file.</param>
    /// <returns>Processes locking the file</returns>
    /// <remarks>See also:
    /// http://msdn.microsoft.com/en-us/library/windows/desktop/aa373661(v=vs.85).aspx
    /// http://wyupdate.googlecode.com/svn-history/r401/trunk/frmFilesInUse.cs (no copyright in code at time of viewing)
    /// 
    /// </remarks>
    static public List<Process> WhoIsLocking(string path)
    {
        uint handle;
        string key = Guid.NewGuid().ToString();
        List<Process> processes = new List<Process>();

        int res = RmStartSession(out handle, 0, key);

        if (res != 0)
            throw new Exception("Could not begin restart session.  Unable to determine file locker.");

        try
        {
            const int ERROR_MORE_DATA = 234;
            uint pnProcInfoNeeded = 0,
                 pnProcInfo = 0,
                 lpdwRebootReasons = RmRebootReasonNone;

            string[] resources = new string[] { path }; // Just checking on one resource.

            res = RmRegisterResources(handle, (uint)resources.Length, resources, 0, null, 0, null);

            if (res != 0) 
                throw new Exception("Could not register resource.");                                    

            //Note: there's a race condition here -- the first call to RmGetList() returns
            //      the total number of process. However, when we call RmGetList() again to get
            //      the actual processes this number may have increased.
            res = RmGetList(handle, out pnProcInfoNeeded, ref pnProcInfo, null, ref lpdwRebootReasons);

            if (res == ERROR_MORE_DATA)
            {
                // Create an array to store the process results
                RM_PROCESS_INFO[] processInfo = new RM_PROCESS_INFO[pnProcInfoNeeded];
                pnProcInfo = pnProcInfoNeeded;

                // Get the list
                res = RmGetList(handle, out pnProcInfoNeeded, ref pnProcInfo, processInfo, ref lpdwRebootReasons);

                if (res == 0)
                {
                    processes = new List<Process>((int)pnProcInfo);

                    // Enumerate all of the results and add them to the 
                    // list to be returned
                    for (int i = 0; i < pnProcInfo; i++)
                    {
                        try
                        {
                            processes.Add(Process.GetProcessById(processInfo[i].Process.dwProcessId));
                        }
                        // catch the error -- in case the process is no longer running
                        catch (ArgumentException) { }
                    }
                }
                else
                    throw new Exception("Could not list processes locking resource.");                    
            }
            else if (res != 0)
                throw new Exception("Could not list processes locking resource. Failed to get size of result.");                    
        }
        finally
        {
            RmEndSession(handle);
        }

        return processes;
    }
}

  • 업데이트 *

여기 다른 [협의를 샘플 코드] [3] 의 재시작해야 Manager 를 사용하는 방법을 제공한다.

[1]: 85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa373656%28v = vs. [2]: 이아스파스 https://msdn.microsoft.com/en-us/library/windows/desktop/cc948910 (v = vs. 85) [3]: https://blogs.msdn.microsoft.com/oldnewthing/20120217-00/? p = 8283

Markus Safar
Serj Sagan
그는 7년 전 댓글을 달았습니다
14

실제로 이 OP 질문이예요 유일한 해답은 답변 맛있겠네요.

Coder14
그는 6년 전 댓글을 달았습니다
4

이 파일은 파일의 경우, 네트워크 공유를 할 수 있고 다른 pc 에 있는 잠겨집니다 에 위치해 있다.

Eric J.
그는 6년 전 댓글을 달았습니다
0

@Lander: 저는 아직 설명서를 언약보다는 말하도다 노력은 한 것 같습니다. 설치 테스트 및 성공한다면요 볼 수 있는 경우 제 대답은 업데이트하려면 느낄 수 있는 무료 발견사항.

Jonathan D
그는 5년 전 댓글을 달았습니다
7

그냥 이를 활용한 및 않니다 작동합니까 네트워크를 통해.

SerG
그는 5년 전 댓글을 달았습니다
0

[Here] (https://msdn.microsoft.com/en-us/magazine/cc163450.aspx) 의 코드는 수행됨을 개선돼야 한다는 일부 결함, 함께 있으면 [이전 새로운 걸] (http://blogs.msdn.com/b/oldnewthing/archive/2012/02/17/10268840.aspx)

Eric J.
그는 5년 전 댓글을 달았습니다
0

@SerG: Thank you for https://partner. 한다는 지적도 나온다. 이미 때 정렬할지 무엇인지 (일부) 개선, 단지 내 원래 게시물로의 편집하십시오 언제든지 할 수 있다.

Tormod
그는 5년 전 댓글을 달았습니다
0

@SerG 아니하였으매 업데이트했는지 해결책은 무엇일까요? (중) 모두 링크 오래된 것으로 보인다.

Eric J.
그는 5년 전 댓글을 달았습니다
1

@Tormod: 예제 코드 업데이트되지 않은 내 대답. # 39 라고 생각한 것, t 가 구체적으로 어떤 세르히 didn& 개선 및 dig 수 있는 시간이 부족합니다. 난 지금 죽은 링크 (link 를 추가한 업데이트되도록 그의 질문에. 이것은 다시 참조 https://blogs.msdn.microsoft.com/oldnewthing/20120217-00/? p = 8283

SerG
그는 5년 전 댓글을 달았습니다
1

난 또 시간적 안정적으로 올바른 답을 편집하려는 @tormod 않았다. 그러나 모든 기억을 레이먼드 첸은 이 글에서 가장 자세히 설명합니다.

Melvyn
그는 4년 전 댓글을 달았습니다
3

만약 누군가 관심이 있는 [내가 만든 사진을] (https://gist.github.com/yaurthek/9423f1855bb176d52a327f5874915a97) 에서 영감을 받은 간단해진다는 높이고 있지만 이 질문에 제대로 함께 붽뎄 포맷됩니다 msdn. 난 뒤, 영감 (靈感) 에서 레이먼드 chen& # 39 조) 도 이날 s care of the 경쟁 상태.

  • 브트와 실행할 수 있다는 사실을 알고 이 방법은 내가 시간을 약 30ms , (마그레트리스트 등의 방법을 통해 내려졌단 20ms) 의 방법을 취득해야 하는 동안 DixonD& # 39 는 잠급니다 5ms.* 미만임 그대로 유지할 경우 이를 염두에 두고 사용할 계획이 꽉 루프지
Fandango68
그는 3년 전 댓글을 달았습니다
0

있나요 VS2005 솔루션이므로 제발이네.

Eric J.
그는 3년 전 댓글을 달았습니다
1

@Fernando68: 비주얼 스튜디오 버전이 이 아무런 상관이 없다. Windows Vista 에서 Windows Server 2008년 또는 그 이상 또는 코드 실행 합니다. # 39, 이전 버전의 Windows don& t 제안하십시오 재시작해야 Manager (단, 다른 사람들에 대해 답을 최적이고 계속 사용할 수 있습니다, 덜 오래된 윈도우 버전).

Vadim Levkovsky
그는 3년 전 댓글을 달았습니다
0

네 사진을 https://partner. @yaurthek 줄바꿈할 또는 오래된 것 같습니다 죄송합니다.

brianary
그는 2년 전 댓글을 달았습니다
0

스레드 로만스였나? 이 외곽진입 동시에 사용할 수 있는 2 개의 프로세스 또는 않아도 되며 함정이거나 조직적으로 싱글턴? 이 경우 로컬 또는 원격 프로세스의 프로세스 (process) 는 네트워크 잠금만입니다 식별됨 잠금식 잠급니다 찾을 수 가 아니라?

Eric J.
그는 2년 전 댓글을 달았습니다
0

이 레스터트만거 안전을 위해 동시에 사용하는 윈도우 API 는 됩니다. (그러나, 이러한 상태를 명시적으로 문서 don& t # 39). 내가 래퍼 코드를 C # 제공하십시오 금고에도요 스레드할 있어야 합니다.

아니, 그런 식으로, 그 정보는 약간만이라도 아웃하기로 죄송합니다. 어차피 쓸모없는 파일을 바로 다음 잠겨집니다 될 수 있기 때문에 두 번째 (검토완료: 짧은 시간 범위).

왜 특별히 필요하신데요 다운로드되었는지 파일 잠겼음을 수 있겠습니까? 할 수 있는 몇 가지 다른 방법으로 vmnet 저희에게 좋은 조언을 제공하고 있습니다.

코드 경우 죽이려하겠어요 다음과 같습니다.

if not locked then
    open and update file

다음 두 선 사이의 다른 프로세스가 파일을 쉽게 할 수 있게 해 줍니다 잠급니다 조교하실 동일한 문제가 발생하지 않도록 하고 시작해야 합니다. 존재한다.

angry person
DixonD
그는 10년 전 댓글을 달았습니다
13

파일이 잠겨 있으면 어느 정도 시간이 재시도하십시오 기다릴 수 있습니다. 또 다른 종류의 파일 액세스 할 경우 그 문제를 우리는 그냥 전파 예외가 아니다.

angry person
그는 10년 전 댓글을 달았습니다
13

있음-그러나 독립 실행형 파일 잠겼음을 서버인지에 확인할지 이를 위해서는 올바른 방법을 사용할 수 있는 유일한 시도하시겠습니까 파일을 열 수 있는 문제를 처리할 목적으로 다음 그 시점에서 잠급니다 파일이므로 합니다. 그리고, 이를 처리할 때, 또는 다른 방법으로 진정하라구요 말하도다.

ctusch
그는 7년 전 댓글을 달았습니다
2

동일한 권리를 주장할 수 있지만, 액세스용 죽이려하겠어요 물론 보다 낮다.

Thiru
그는 7년 전 댓글을 달았습니다
7

또 다른 장점은 @lassev.karlsen 할 수 있는 사용자 통지합니다 시도하기 전에 선제적으로 검사가 가능한 긴 작업을 중단 및 중반 방법. 이 경기 중반 방법 및 잠급니다 수는 있지만, 대부분의 시나리오에서와 이 보호하리요 처리됩니까 합니다 물론 사용자 환경이 크게 떨어진다.

Bart Calixto
그는 7년 전 댓글을 달았습니다
1

내가 생각하는 가장 훌륭한 책임질래 는 필 트레더웨이트포룬록 (파일, 시간 초과) 메서드입니다. 널 (null) 또는 파일 및 반환 여부에 따라. # 39 m, 다음과 같은 논리를 i& 여기서요?

angry person
그는 7년 전 댓글을 달았습니다
0

구체적으로 정의할 수 있는 방법, 어디 desktopplatforms @bart 제공하십시오 https://partner. microsoft. it? 그리고, 2008년 3 · 4 분기중으로 유념하십시오 제 대답은 했지만, 아직도 .NET 런타임용으로 개발하십시오 및 모든 다른 것으로 알려졌다. 지정하십시오. 필 트레더웨이트포룬록 '?'

Bart Calixto
그는 7년 전 댓글을 달았습니다
0

내가 내 문제에 대한 대답을 토대로 사용하여 @lassev.karlsen 체크아웃합니다 됐지. 나만의 방법을 레더웨이트포룬록 끝에 트리오픈리드 변경할 수 있다.

Eric J.
그는 7년 전 댓글을 달았습니다
0

이제 프로세스 즉 잠금식 파일을 얻을 수 있습니다. Http://stackoverflow.com/a/20623302/141172 참조

brianary
그는 2년 전 댓글을 달았습니다
1

가지 않을 것이라고, 많은 경우는 테스트 잠급니다 &quot useless". 검사, 이는 하나의 파일에 쓰기 위해 매일, IIS 로깅합니다 잠급니다 잠겼음을 확인할 수 있는 대표적인 예로, 이런 상황에 로깅하기 전체 종류 중 하나이다. # 39 의 값을 얻을 수 있을 만큼 충분한 it& 컨텍스트로 잠급니다 에서 테스트 시스템을 잘 식별할 수 있습니다. 사용하지 않는 경우, 일반 제어 흐름에 대한 예외 &quot possible.&quot https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/exception-throwing -;

Alexandre
그는 2년 전 댓글을 달았습니다
0

39 는 t know why i don&, 대답을 한 것은 잘못된 수락됨 무릎은 이유였다. 몇 가지 다른 프로세스가 파일에 대한 정당한 /dev/raw/raw1 잠금자 확인할 수 있다. 미리 확인할 수 있는 고려하고 있지만 시도가 실패한 후 파일이 잠겨 있는지 확인할 수 있습니다 읽거나 쓸 수 있도록 모든 사용자 파일을 올바르게 로깅합니다 및 / 또는.

이 파일을 사용하는 경우 프로세스는 확인할 수 있습니다, 쇼 프로그램 바뀌엇어요 닫으십시오 등과 같은 설치자는 높여줍니까 계속 합니다.

public static string GetFileProcessName(string filePath)
{
    Process[] procs = Process.GetProcesses();
    string fileName = Path.GetFileName(filePath);

    foreach (Process proc in procs)
    {
        if (proc.MainWindowHandle != new IntPtr(0) && !proc.HasExited)
        {
            ProcessModule[] arr = new ProcessModule[proc.Modules.Count];

            foreach (ProcessModule pm in proc.Modules)
            {
                if (pm.ModuleName == fileName)
                    return proc.ProcessName;
            }
        }
    }

    return null;
}

Markus Safar
Constantin
그는 8년 전 댓글을 달았습니다
14

이 다분히 어떤 프로세스가 계속 떠날려하면 충족되었으며 executable module (dll) 잠겼습니다. 당신에게 어떤 프로세스가 잠겨, xml 파일을 않을 것이라고 말하고 있습니다.

닷넷 (.net) 기반 클래스 메서드를 사용하여 파일 및 잠금해제합니다 잠급니다 interop 대신 사용할 수 있습니다.

피레스트리아메드록 http://msdn.microsoft.com/en-us/library/system.io.filestream.lock.aspx

피레스트림.운록 http://msdn.microsoft.com/en-us/library/system.io.filestream.unlock.aspx

BrainSlugs83
그는 9년 전 댓글을 달았습니다
1

이거 진짜 정답이 아니라 사용자 수 있지만, 이는 보기입니다 잠급니다 파일의 파일 / 잠금해제합니다 단면에는 잘 알려져 있다.

39, t, 모든 &quot can& transactions&quot 없이 할 수 있습니다. 의견을 올릴 수 있지만, 그 이후 유효한 염려사항 않습니다를 유용한 기능을 isn& they& # 39 척 하고 있을 때, s, t # 39 가 어떤 감춰집니다 또는 it& # 39 없습니다.

Zé Carlos
그는 9년 전 댓글을 달았습니다
30

사실 이건 솔루션이 아닌 만들 수 없게 되므로 인스턴스입니다 FileStream 파일의 경우 잠겼음을. (예외가 발생합니다)

39 의 코드 s # 39 의 변형, here& DixonD& 때까지 기다리는 시간 (초) 을 추가하는 잠금해제합니다, 파일을 재시도하십시오:

public bool IsFileLocked(string filePath, int secondsToWait)
{
    bool isLocked = true;
    int i = 0;

    while (isLocked &&  ((i < secondsToWait) || (secondsToWait == 0)))
    {
        try
        {
            using (File.Open(filePath, FileMode.Open)) { }
            return false;
        }
        catch (IOException e)
        {
            var errorCode = Marshal.GetHRForException(e) & ((1 << 16) - 1);
            isLocked = errorCode == 32 || errorCode == 33;
            i++;

            if (secondsToWait !=0)
                new System.Threading.ManualResetEvent(false).WaitOne(1000);
        }
    }

    return isLocked;
}

if (!IsFileLocked(file, 10))
{
    ...
}
else
{
    throw new Exception(...);
}

Markus Safar
DixonD
그는 7년 전 댓글을 달았습니다
1

뭐, 내가 하고 있는 사람이 내 원래 똑같은 종류의 인도되니 오토메이티드 정보기술 (it) 단순화하도록 했다) http://stackoverflow.com/posts/3202085/revisions

39 의 뛰어난 오토메이티드 DixonD& 의 변형 (위).

public static bool TryOpen(string path,
                           FileMode fileMode,
                           FileAccess fileAccess,
                           FileShare fileShare,
                           TimeSpan timeout,
                           out Stream stream)
{
    var endTime = DateTime.Now + timeout;

    while (DateTime.Now < endTime)
    {
        if (TryOpen(path, fileMode, fileAccess, fileShare, out stream))
            return true;
    }

    stream = null;
    return false;
}

public static bool TryOpen(string path,
                           FileMode fileMode,
                           FileAccess fileAccess,
                           FileShare fileShare,
                           out Stream stream)
{
    try
    {
        stream = File.Open(path, fileMode, fileAccess, fileShare);
        return true;
    }
    catch (IOException e)
    {
        if (!FileIsLocked(e))
            throw;

        stream = null;
        return false;
    }
}

private const uint HRFileLocked = 0x80070020;
private const uint HRPortionOfFileLocked = 0x80070021;

private static bool FileIsLocked(IOException ioException)
{
    var errorCode = (uint)Marshal.GetHRForException(ioException);
    return errorCode == HRFileLocked || errorCode == HRPortionOfFileLocked;
}

사용법:

private void Sample(string filePath)
{
    Stream stream = null;

    try
    {
        var timeOut = TimeSpan.FromSeconds(1);

        if (!TryOpen(filePath,
                     FileMode.Open,
                     FileAccess.ReadWrite,
                     FileShare.ReadWrite,
                     timeOut,
                     out stream))
            return;

        // Use stream...
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }
}

Markus Safar
Contango
그는 8년 전 댓글을 달았습니다
0

이것이 유일한 실용적으로 부진했다. 및 작동하잖아.

Paul Knopf
그는 6년 전 댓글을 달았습니다
7

부로이야. 거기에 내 CPU 보다 잘 동일팔레트에 일부 트레더릭스리프 (200) 및 좀 놔바!!

Tristan
그는 6년 전 댓글을 달았습니다
1

어떤 부품 설정하시겠습니까 자고 있었어? 왜?

DixonD
그는 6년 전 댓글을 달았습니다
1

그 사이에 액세스 할 것 같아요, 폴 크노프 @tristan 트레더릭스리프 사용합니다.

Phil Cooper
그는 5년 전 댓글을 달았습니다
1

39 의 주석문입니다 시도하시겠습니까 판독값 @PaulKnopf& 사용하지 않고 짜증스러운 걸프렌즈 음성 in your 헤드입니다.

Andreas
그는 4년 전 댓글을 달았습니다
0

,) 의 경우, I got a 제외어 가치를 &quot FileNotFound&quot 제니퍼 1세페시옹 () 및 카타시안 오버클로킹된 오버플로입니다 오류 (이후의 코드는 컴파일할 오버플로입니다 검사 활성화됨). 내가 보고, 선택하지 않은 최대한 안전하게 목마르겠구나 변환

NickG
그는 4년 전 댓글을 달았습니다
0

@PaulKnopf 등을 깨달았습니다. 필요 없는 트레더릭스리프 없기 때문에 루프 () 이 코드의.

DixonD
그는 3년 전 댓글을 달았습니다
0

There was a 루프 좁히어 당초 @nickg 전에 편집

록필레 의 영역에 interop 통해 부를 수 있는 파일이 resistor1.prt 관심이 모아지고 있다. 이렇게 하면 성공할 경우 예외가 아닌 할 수 있는 부분을 잠기고 있는 파일 (열리는 따라 프로세스), 잠급니다 전화하시기 운록필레 또는 해당 프로세스 죽을 때까지 열린다.

볼 수 있는 파일의 경우, 또는 잠궜습니다 읽으려고 잠그지는 교도관님도요 이번이 처음이다.

[부탁이네 보러 오토메이티드 자세한 내용은 여기] [1].

[1]: # 203839 https://stackoverflow.com/questions/203837/can-i-simply-read-a-file-that-is-in-use/203839

&gt. 다음 두 선 사이의 다른 프로세스가 파일을 쉽게 할 수 있게 해 줍니다 잠급니다 조교하실 동일한 문제가 발생하지 않도록 하고 시작해야 합니다. 존재한다.

그러나 문제는 이런 식으로 보나마나죠 일시적입니다 및 재시도할 실행하십시오. (E. g., 작성할 수 있습니다 한 바로 그러한 경우 생길 때까지 계속 잠급니다 재시도하기 잠급니다 쓸 때, 우리 곁을 떠났다.)

반면, 이 중 ioexception 이 자체가 없을 정도로 잠금식 특정 입출력 실패 원인이 될 수도 있습니다. # 39, 임시 aren& 하는 이유는 있을 수 없다.

그러나 Powershell 같은 것입니다.

function Test-FileOpen
{
    Param
    ([string]$FileToOpen)
    try
    {
        $openFile =([system.io.file]::Open($FileToOpen,[system.io.filemode]::Open))
        $open =$true
        $openFile.close()
    }
    catch
    {
        $open = $false
    }
    $open
}

됐지 내가 할 수 있다.

internal void LoadExternalData() {
    FileStream file;

    if (TryOpenRead("filepath/filename", 5, out file)) {
        using (file)
        using (StreamReader reader = new StreamReader(file)) {
         // do something 
        }
    }
}

internal bool TryOpenRead(string path, int timeout, out FileStream file) {
    bool isLocked = true;
    bool condition = true;

    do {
        try {
            file = File.OpenRead(path);
            return true;
        }
        catch (IOException e) {
            var errorCode = Marshal.GetHRForException(e) & ((1 << 16) - 1);
            isLocked = errorCode == 32 || errorCode == 33;
            condition = (isLocked && timeout > 0);

            if (condition) {
                // we only wait if the file is locked. If the exception is of any other type, there's no point on keep trying. just return false and null;
                timeout--;
                new System.Threading.ManualResetEvent(false).WaitOne(1000);
            }
        }
    }
    while (condition);

    file = null;
    return false;
}

Markus Safar
VoteCoffee
그는 6년 전 댓글을 달았습니다
1

한 파일에 대한 블록이어야 사용하는 것이 좋습니다

Endrju
그는 6년 전 댓글을 달았습니다
1

시스템스트레이딩스트레더릭스리프 사용하여 ' (1000년)' 대신 '새 시스템스트레이딩스마누알레스티븐스 드와이턴 (false) (1000년)'