8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

IOException:该进程无法访问文件“文件路径”,因为它正在被另一个进程使用

John Rix 1月前

40 0

我有一些代码,当它执行时,它会抛出一个 IOException,说进程无法访问文件“filename”,因为它正在被另一个进程使用这是什么意思,...

我有一些代码,当它执行时,它会抛出一个 IOException ,说

该进程无法访问文件“filename”,因为该文件正在被另一个进程使用

这意味着什么?我该怎么办?

帖子版权声明 1、本帖标题:IOException:该进程无法访问文件“文件路径”,因为它正在被另一个进程使用
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由John Rix在本站《asp.net-mvc》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 该错误表示另一个进程正在尝试访问该文件。也许您或其他人在您尝试写入文件时打开了该文件。\'读取\'或\'复制\'通常不会导致这种情况,但写入或调用删除操作会导致这种情况。

    正如其他答案所提到的,有一些基本的事情可以避免这种情况:

    1. 点2

      点3

      using (FileStream stream = File.Open(path, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)){}

      点4

    2. p5

    3. p6

      List<Process> lstProcs = ProcessHandler.WhoIsLocking(file);

      p7

    4. p8

      p9

      ProcessHandler.localProcessKill("winword.exe");

      p10

      ProcessHandler.remoteProcessKill(computerName, txtUserName, txtPassword, "winword.exe");

      p11

    5. p12

      List<Process> lstProcs = new List<Process>();lstProcs = ProcessHandler.WhoIsLocking(file);foreach (Process p in lstProcs){    if (p.MachineName == ".")        ProcessHandler.localProcessKill(p.ProcessName);    else        ProcessHandler.remoteProcessKill(p.MachineName, txtUserName, txtPassword, p.ProcessName);}

      p13

      p14

      using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Runtime.InteropServices;using System.Diagnostics;using System.Management;namespace MyProject{    public static class ProcessHandler    {        [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;        }        public static void remoteProcessKill(string computerName, string userName, string pword, string processName)        {            var connectoptions = new ConnectionOptions();            connectoptions.Username = userName;            connectoptions.Password = pword;            ManagementScope scope = new ManagementScope(@"\\" + computerName + @"\root\cimv2", connectoptions);            // WMI query            var query = new SelectQuery("select * from Win32_process where name = '" + processName + "'");            using (var searcher = new ManagementObjectSearcher(scope, query))            {                foreach (ManagementObject process in searcher.Get())                 {                    process.InvokeMethod("Terminate", null);                    process.Dispose();                }            }                    }        public static void localProcessKill(string processName)        {            foreach (Process p in Process.GetProcessesByName(processName))            {                p.Kill();            }        }        [DllImport("kernel32.dll")]        public static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, int dwFlags);        public const int MOVEFILE_DELAY_UNTIL_REBOOT = 0x4;    }}
返回
作者最近主题: