Я могу получить доступ к файлу по сетевому пути, но не могу сохранить по тому же пути (C#) (asp.net)
В этом объявлении нет проблем с доступом к файлу в моей сети.
MyApp = new Excel.Application();
MyApp.Visible = false;
MyBook = MyApp.Workbooks.Open("//NetworkFolderPath/File.xlsx"); //This line
MySheet = (Excel.Worksheet)MyBook.Sheets[1];
Проблема возникает, когда я закончу редактирование своего файла и пытаюсь сохранить его, используя метод "SaveCopyAs()".
MyBook.SaveCopyAs("//NetworkFolderPath/File2.xlsx");
MyBook.Close(0);
Исключение, которое я получаю,
An exception of type 'System.Runtime.InteropServices.COMException' occurred in Application.dll but was not handled in user code
Additional information: Microsoft Excel cannot access the file '//NetworkFolderPath/File2.xlsx'. There are several possible reasons:
1. The file name or path does not exist.
2. The file is being used by another program.
3. The workbook you are trying to save has the same name as a currently open workbook.
Для номера 1: файл существует в папке m, и я получил доступ к файлу по пути, поэтому я исключил номер 1.
Для номера 2: я не уверен, может ли это быть причиной, было бы неплохо какое-то объяснение
Для номера 3: я присвоил книге другое имя, но я не уверен, решит ли это проблему.
Я действительно не уверен, куда идти отсюда. Вся помощь приветствуется.
1 ответ
Я видел это path does not exist
ошибка при включении автономных файлов и повреждении кэша. Попробуйте сбросить кеш, следуя инструкциям.
Попробуйте это, это сэкономит мои 2 недели усилий, и приложение сохраняет pdf-файл на sahredpath с защищенным идентификатором (учетные данные), если у вас есть какие-либо вопросы, прокомментируйте ниже! Рад помочь вам
============================ публичный класс Impersonate { [DllImport("advapi32.dll", SetLastError = true)] приватный статический extern int LogonUser(строка lpszUsername, строка lpszDomain, строка lpszPassword, int dwLogonType, int dwLogonProvider, out int phToken);
[DllImport("kernel32.dll")]
private static extern int FormatMessage(int dwFlags, string lpSource, int dwMessageId, int dwLanguageId,
StringBuilder lpBuffer, int nSize, string[] Arguments);
private const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;
private const int LOGON32_PROVIDER_DEFAULT = 0;
private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000;
private static WindowsImpersonationContext winImpersonationContext = null;
public static void ImpersonateUser(string domain, string userName, string password)
{
//Benutzer einloggen
int userToken = 0;
bool loggedOn = (LogonUser(userName, domain, password, LOGON32_LOGON_NETWORK_CLEARTEXT,
LOGON32_PROVIDER_DEFAULT, out userToken) != 0);
if (loggedOn == false)
{
int apiError = Marshal.GetLastWin32Error();
StringBuilder errorMessage = new StringBuilder(1024);
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, null, apiError, 0, errorMessage, 1024, null);
throw new Exception(errorMessage.ToString());
}
WindowsIdentity identity = new WindowsIdentity((IntPtr)userToken);
winImpersonationContext = identity.Impersonate();
}
public static void UndoImpersonation()
{
if (winImpersonationContext != null)
{
winImpersonationContext.Undo();
}
}
}
2. Вызов олицетворения
Impersonate.ImpersonateUser("domain", "user name", "password");
//Your Code as the new User
DirectoryInfo _dirInfo = new DirectoryInfo(@"file path");
FileInfo[] _files = FileExtension.GetFilesByExtensions(_dirInfo, ".xls", ".xlsx").ToArray();
Impersonate.UndoImpersonation();
==============================