Проверка наличия файла & ldquo; в использовании & rdquo; другим способом [дублировать]

Хорошо, ребята, я нашел ответы, я не знаю, правильно ли я работаю.

Здесь мой код:

private static final Pattern imgRegExp  = Pattern.compile( "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>" );
public send(email) throws Exception{

   Map<String, String> inlineImage = new HashMap<String, String>();
   String body = email.getBody();
   final Matcher matcher = imgRegExp.matcher( body );
   int i = 0;
   while ( matcher.find() ) {
      String src = matcher.group();
      if ( body.indexOf( src ) != -1 ) {
         String srcToken = "src=\"";
         int x = src.indexOf( srcToken );
         int y = src.indexOf( "\"", x + srcToken.length() );
         String srcText = src.substring( x + srcToken.length(), y );
         String cid = "image" + i;
         String newSrc = src.replace( srcText, "cid:" + cid );
         inlineImage.put( cid, srcText.split( "," )[1] );
         body = body.replace( src, newSrc );
         i++;
      }
   }
   Transport transport = mailSession.getTransport();
   MimeMessage message = new MimeMessage( mailSession );
   message.setSubject( email.getObjet() );
   message.setSender( new InternetAddress( email.getSender() ) );
   message.setFrom( new InternetAddress( email.getFrom()) );
   BodyPart bp = new MimeBodyPart();
   bp.setContent( body, "text/html" );
   MimeMultipart mmp = new MimeMultipart();
   mmp.addBodyPart( bp );
   Iterator<Entry<String, String>> it = inlineImage.entrySet().iterator();
   while ( it.hasNext() ) {
      Entry<String, String> pairs = it.next();
      PreencodedMimeBodyPart pmp = new PreencodedMimeBodyPart( "base64" );
      pmp.setHeader( "Content-ID", "<" + pairs.getKey() + ">" );
      pmp.setDisposition( MimeBodyPart.INLINE );
      pmp.setText( pairs.getValue() );
      mmp.addBodyPart( pmp );
   }
   message.setContent( mmp );
   message.addRecipient( Message.RecipientType.TO, new InternetAddress( email.getTo() ) );
   transport.connect();
   transport.sendMessage( message, message.getAllRecipients() );
   transport.close();
}

Спасибо за помощь меня улучшить, если нужно улучшить:)

8
задан Dayan 26 March 2013 в 02:02
поделиться

3 ответа

Private Sub IsFileOpen(ByVal file As FileInfo)
    Dim stream As FileStream = Nothing
    Try
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None)
        stream.Close()
    Catch ex As Exception

        If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then
            ' do something here, either close the file if you have a handle, show a msgbox, retry  or as a last resort terminate the process - which could cause corruption and lose data
        End If
    End Try
End Sub

Private Shared Function IsFileLocked(exception As Exception) As Boolean
    Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1)
    Return errorCode = 32 OrElse errorCode = 33
End Function
15
ответ дан Jeremy Thompson 22 August 2018 в 16:36
поделиться
  • 1
    Отличное решение. Я бы просто добавил, что вам нужно быть уверенным в stream.close (), если нет исключения, поэтому программа может продолжить работу без проблем. – mlerley 21 November 2012 в 03:42
  • 2
    В нем говорится, что маршал не объявлен. – Cary Bondoc 3 July 2015 в 01:21
  • 3
    @CaryBondoc Imports System.Runtime.InteropServices; для исправления маркера не объявляется . Совет: Marshal будет иметь синюю подсветку, наведите указатель мыши на это, и он даст вам подсказку о том, что не так! – Jeremy Thompson 3 July 2015 в 01:23
  • 4
    Благодаря! Это сработало. Не могли бы вы подробнее рассказать о том, как использовать код @JeremyThompson. Теперь он говорит Value of type 'String' cannot be converted to 'System.IO.FileInfo'. – Cary Bondoc 3 July 2015 в 02:11
  • 5
    Call IsFileOpen(new FileInfo(filePath)) – Jeremy Thompson 3 July 2015 в 02:38

Нет смысла использовать функцию «использовать файл для проверки», так как вам все равно нужно попытаться поймать, чтобы обработать случай, когда файл не открывается. Открытие файла может завершиться неудачей по многим причинам, кроме того, что он уже открыт.

Также использование функции для проверки не является гарантией успеха. «Проверка использования файла» может возвращать false только для того, чтобы файл был открыт с ошибкой с уже открывшейся ошибкой файла, потому что время между проверкой и попыткой открыть файл было открыто кем-то другим.

6
ответ дан jussij 22 August 2018 в 16:36
поделиться
  • 1
    должен действительно быть комментарием вместо ответа – TruthOf42 24 November 2014 в 18:05

Похоже, что два предложения из этого форума MSDN, посвященного публикации , связаны с попыткой открыть файл.

Первый похож на то, что вы делаете сейчас, и второй включает использование функции Windows API (CreateFile) и проверка недопустимого дескриптора, означающего, что файл используется. В обоих случаях они полагаются на условие ошибки, чтобы определить, открыт ли файл или нет. Короче говоря, на мой взгляд, метод, который вы используете, верен, поскольку нет свойства System.IO.File.IsOpen.

2
ответ дан Mark Hall 22 August 2018 в 16:36
поделиться
  • 1
    Привет, Марк, я уверен, что вы знаете, что в ответах StackOverflow обычно используется сводка содержимого ссылки или основные моменты, которые специально отвечают на вопрос. Цель сайтов SE - стать ресурсом знаний, ответов на долгие годы. При ответе только на ссылку, op должен вырыть другой ресурс, чтобы найти ответ, который он / она может не знать. Самое главное, если ваша ссылка будет когда-либо ломаться, ваш ответ бесполезен для всех, кто посещает эту страницу в будущем. Приветствия за ссылку! – Jeremy Thompson 2 July 2012 в 07:45
  • 2
    @JeremyThompson Я знаю об этом, и я это делаю. В этом случае я принял сознательное решение не вставлять какой-либо код. Я не пытался предположить, что это был правильный путь. Я пытался успокоить ОП, что способ, которым он это делал, был прав, ИМХО. Предложить, чтобы он использовал WinApi, не был тем, что я пытался сделать, и в этом случае излишним. – Mark Hall 2 July 2012 в 15:35
  • 3
    Спасибо, Марк, я ценю ваш ответ, и я согласен, что это слишком много, но это дало мне хороший прогноз на эту тему! Еще раз спасибо :) – Dayan 3 July 2012 в 14:21
  • 4
    @ Intrus Glad Я мог бы помочь. – Mark Hall 3 July 2012 в 16:01
Другие вопросы по тегам:

Похожие вопросы: