虽然我真的很喜欢InnoSetup,但我已经忍受了这段错误的信息了一段时间,但我的挫折感已经达到了新的高度.有很多帖子抱怨这个问题,这肯定是一个InnoSetup错误,但没有我能找到的有用的解决方法.
我有一个非常简单(签名)的设置,只是复制一些文件并创建一个快捷方式.它甚至不包含可执行文件.当我尝试编译设置时,我得到这个"进程无法访问该文件,因为它正被另一个进程使用"消息 - 反复(通常我总是在3次尝试中编译设置),但现在看起来徒劳无功经过很多次.许多尝试.从InnoSetup输出或错误对话框中不清楚"正在使用"的文件.绝大多数竞争流程都没有运行.(我重新启动了机器并仍然收到此消息).
任何关于如何解决这个问题的想法都非常感谢.
这是完整的设置代码 - 它已签名,但这与我使用相同签名创建的其他设置不同.
#define MyAppName "Easy-IAP for IronKey"
#define MyAppVersion "4.0"
#define MyAppPublisher "Command Post Solutions"
#define MyAppURL "http://www.commandpostsolutions.com/"
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{51668D56-27F6-4C83-87F2-677328EFE808}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName="\EZ-IAP"
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=IronKeySetup
SetupIconFile=C:\Users\ron\Dropbox\EZIAP\eziap.ico
Compression=lzma
SolidCompression=yes
SignedUninstaller=yes
SignTool=Standard …
Run Code Online (Sandbox Code Playgroud) 我已经看到很多这样的问题已经解决了,问题主要是由于流没有被妥善处理.
我的问题略有不同,请点击代码段
foreach (Images item in ListOfImages)
{
newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
File.Create(newPath);
File.WriteAllBytes(newPath, item.File);
}
Run Code Online (Sandbox Code Playgroud)
Images
自定义结构在哪里,item.File
是原始数据byte [].
我的问题是,在WriteAllBytes
调用它的行中,抛出异常.消息如下:
The process cannot access the file because it is being used by another process
我再也不知道我怎么会以某种方式进行close
这个过程.
我们正在尝试同时将更新推送到多个服务器,我的经理发现可以重命名正在运行的.exe文件.利用这些知识,他想重命名正在运行的exe并复制所述exe的新版本,这样任何运行foo.exe的内存副本的人都可以,并且任何打开指向foo.exe的快捷方式的人都将获得一个新副本已应用更新.
我想我需要澄清,他不希望旧版本神奇地更新,他只是希望他们继续运行旧版本,直到他们再次打开exe,在这种情况下,它将打开新的名称,具有该名称旧的.
它有时会抛出一个异常,即文件在他的程序中使用,但如果他尝试在循环中重命名它最终会成功.在我的机器上,我甚至无法在循环中使其工作.
我的第一个主要问题是:这样做是否可以接受.重命名正在运行的可执行文件是否应该是有效的方案?
其次,如果它是一个有效的场景,那么怎么可靠地做到这一点呢?我们目前的想法是尝试使用File.Move(C#)进行重命名,如果它不起作用,则写出错误日志,以便手动处理.
我有一个线程用于ReadDirectoryChangesW
在文件夹中添加或删除文件时通知我.
对于每个新图像,我打开文件并创建图像的缩略图.但是,在将文件完全复制到目标文件夹之前,我会收到通知,在这种情况下,我只会获得部分缩略图.(文件从远程位置复制到中央服务器,网络在高峰时间可能会变慢.)
我确实检查文件是否正在使用,但这似乎不适用于图像文件.
HFileRes := CreateFile(pchar(Filename), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;
Result := (HFileRes = INVALID_HANDLE_VALUE);
if (not Result) then
CloseHandle(HFileRes) ;
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有办法检测文件何时被完全复制,或者我只是等到文件大小或上次修改时间自上次检查后没有改变?
我创建了一个程序,它能够通过datagridview修改.exe.config文件(app config)的内容,并在datagridview上显示键值对.问题是,我有一个保存设置,它将旧值替换为用户键入的新值.它保存,下次打开它时,文件将被覆盖,但当我尝试加载配置文件以更新用户设置已更改为时,我得到"另一个进程使用的文件"错误.
这是代码:
private XmlDocument m_XmlDoc;
private FileStream fIn;
private StreamReader sr;
private StreamWriter sw;
private OrderedDictionary m_Settings;
private void ProgramConfig_Load(object sender, EventArgs e)
{
try
{
loadconfigfile(GatewayConfiguration.Properties.Settings.Default.Config);
BindingList<KeyValueType> list = new BindingList<KeyValueType>();
for (index = 0; index < m_Settings.Count; index++)
{
list.Add(new KeyValueType(keys[index], values[index].ToString()));
}
var source = new BindingSource();
source.DataSource = list;
dataGridView1.DataSource = source;
}
catch (Exception ex)
{
textBox1.Text = ex.Message;
}
}
public void loadconfigfile(string configfile)
{
if (File.Exists(configfile))
{
m_XmlDoc = new XmlDocument();
GatewayConfiguration.Properties.Settings.Default.Config …
Run Code Online (Sandbox Code Playgroud) 在 Windows 等上,我曾经使用一种技巧来找出当前正在使用的文件(专门编写的)。
我用来打开文件进行写入,如果它失败了,很可能另一个进程正忙于访问它。
遗憾的是,这些技巧(使用带有排他锁的 C OPEN 进行写入)在我的 Mac 上不起作用。虽然我在终端中的 curl 仍在写入我的 -fileBusy() 检查失败。
使用 F_GETLK 对 fd 调用 fcnt 也不会显示任何锁定。
我有没有机会检测一个文件是否正在被另一个进程使用?
Ps> 无法侦听 fsevents,因为我的应用程序在其他应用程序/进程创建之后启动。
我正在尝试使用 StreamWriter 写入文件。
Dim write as IO.StreamWriter
write = new io.streamwriter(file)
write.write(txtEncryption.text)
write.close
Run Code Online (Sandbox Code Playgroud)
我在调试模式下停止了代码,我看到它崩溃并在到达第 2 行时直接进入异常。
是因为我刚刚制作了文件并且它仍在使用中吗?我怎样才能避免这种情况?
当有文件的更新补丁必须用现有文件替换时,如果其中一个文件正在被任何进程使用,则会弹出一个正在使用的文件对话框。我想避免那个对话框并使该文件排队等待安装,以便在系统重新启动时安装它。我已经读到在重新启动时排队更新文件是 Windows 安装程序的内置功能。有人可以建议我删除那个 FileInUse 对话框的方法。我尝试将“MsiRMFilesInUse”属性设置为“0”,但没有奏效。
我通过以下代码上传文件.
上传成功后,我试图删除该文件,但我得到一个32 - 文件正在使用错误.
任何人都可以告诉我如何在使用错误中解决此文件?以下代码正在上传文件,但在完成后不会释放它.
var
HTTP: TidHTTP;
SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
PostData: TIdMultiPartFormDataStream;
ResponseStream: TStringStream;
Delete : Boolean;
begin
ResponseStream := TStringStream.Create('');
HTTP := TidHTTP.Create(nil);
SSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
SSLIOHandler.SSLOptions.Method := sslvSSLv3;
HTTP.ReadTimeout := 30000; //30 seconds
HTTP.ConnectTimeout := 30000; //30 seconds
HTTP.IOHandler := SSLIOHandler;
HTTP.HTTPOptions := [hoKeepOrigProtocol];
HTTP.ProtocolVersion := pv1_1;
PostData := TIdMultiPartFormDataStream.Create;
PostData.AddFormField('username', 'demo');
PostData.AddFormField('password', 'demo');
PostData.AddFormField('action', 'upload');
PostData.AddFormField('accountno', 'demo');
PostData.AddFile('uploadedfile', FileName, GetMIMETypeFromFile(FileName));
HTTP.Request.ContentType := PostData.RequestContentType;
HTTP.Post('http://uploadsite.com/ex/exampleAPI.asmx/Process', PostData, ResponseStream);
if AnsiContainsStr(ResponseStream.DataString, 'Done') then
Delete := True;
finally
SSLIOHandler.Free;
HTTP.Free; …
Run Code Online (Sandbox Code Playgroud) 我有一个循环,它向电子邮件列表中的人员发送带有附件的电子邮件。问题是,当涉及到列表中的最后一个人时,我在电子邮件中附加的文件仍然保持在 Windows 中使用的状态。
for index, row in f.iterrows():
print (row["ManagerEmail"]+row["filename"])
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['Subject'] = row["filename"] + f" Sales Letter"
msg.attach(MIMEText(body, 'plain'))
filename = row["filename"]
toaddr = row["ManagerEmail"]
attachment = open(row["filepath"], "rb")
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(part)
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
Run Code Online (Sandbox Code Playgroud)
不知何故,我需要在末尾添加一个参数来关闭文件,但我不知道该怎么做。
file-in-use ×10
c# ×3
file ×3
delphi ×2
.net ×1
asp.net ×1
cocoa ×1
debugging ×1
delphi-2009 ×1
file-rename ×1
inno-setup ×1
macos ×1
objective-c ×1
python ×1
reboot ×1
streamwriter ×1
vb.net ×1
windows ×1
wix ×1